【问题标题】:How to remove empty line at the end of the file?如何删除文件末尾的空行?
【发布时间】:2017-03-27 13:12:53
【问题描述】:

我有一个文本文件,用于存储物品的信息。

10325,Test1,Producto del Hogar,12,17
10425,Test2,Videojuegos,11,17
12345,Test3,Producto del Hogar,56,17.0

我正在使用 opencsv 库来修改所需项目的一列,我正在使用此代码:

public void updateCSV(String replace, int fila, int col) throws IOException {
    if (replace != null) {
        File archivoProductos = new File("productos.txt");
        // Read existing file
        CSVReader reader = new CSVReader(new FileReader(archivoProductos), ',', CSVWriter.NO_QUOTE_CHARACTER,
                CSVWriter.NO_ESCAPE_CHARACTER);
        List<String[]> csvBody = reader.readAll();
        // get CSV row column and replace with by using row and column
        csvBody.get(fila)[col] = replace;
        reader.close();
        // Write to CSV file which is open
        CSVWriter writer = new CSVWriter(new FileWriter(archivoProductos), ',', CSVWriter.NO_QUOTE_CHARACTER,
                CSVWriter.NO_ESCAPE_CHARACTER, System.getProperty("line.separator"));
        writer.writeAll(csvBody);
        writer.flush();
        writer.close();

    }
}

问题是修改完成后,文本文件末尾多了一个空行。

line1  10325,Test99,Producto del Hogar,12,17
line3  10425,Test2,Videojuegos,11,17
line2  12345,Test3,Producto del Hogar,56,17.0
line4

如何避免在末尾添加空行?

在它写出之前添加了 csvBody 的 println

[10325, Test99, Producto del Hogar, 12, 17]
[10425, Test2, Videojuegos, 11, 17]
[12345, Test3, Producto del Hogar, 56, 17.0]

到目前为止尝试过:

不添加空行,但我现有的 3 行现在只写在一行中。

CSVWriter writer = new CSVWriter(new FileWriter(archivoProductos), ',', 
                  CSVWriter.NO_QUOTE_CHARACTER,
                  CSVWriter.NO_ESCAPE_CHARACTER,"");

【问题讨论】:

  • csvBody 在你写出来之前是什么样子的?你可以使用打印语句来查看。
  • 你可以试试这个吗? CSVWriter writer = new CSVWriter(new FileWriter(archivoProductos), ',', CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER);
  • 我更新了帖子,你可以看到csvBody中没有空行,如果我删除空行并想修改另一行,空行会回来。 @melgart
  • 我已经试过了,没用 :( @javaguy

标签: java file-io io opencsv


【解决方案1】:

也许你想插入一个测试,这样你就不用写决赛了……

System.getProperty("line.separator")

...如果没有更多数据。或者,这可能执行得更快,只需在写入/保存文件之前修剪最后一个分隔符。

【讨论】:

    【解决方案2】:

    好的,所以从稍微不同的角度来看它,我会问你为什么要发送 System.getProperty("line.separator") - 答案是你所在的系统使用行分隔符除了换行符“\n”。

    我怀疑您使用的编辑器没有很好地处理不同的换行符。如果您在 *Nix 系统(Linux、Unix、BSD、Mac 等)上运行“wc -l”以获取真正的行数并查看返回的行数是 3 还是 4。否则尝试不同的编辑器。

    另一种可能性是对您的输入文件进行十六进制转储,看看它是否有额外的换行符。可能是这种情况,读者将其作为一个额外的、空的记录来选择,而 CSVWriter 正在尽职尽责地把它写出来。如果是这样,您将需要编写逻辑以在读取 List 后循环遍历它,并在写入前删除那些为空的。我认为这是真正的罪魁祸首。

    【讨论】:

      【解决方案3】:

      问题在于您的换行符,因此您需要将换行符(最后一个参数)作为CSVWriter 构造函数的“”而不是System.getProperty("line.separator") 发送,如下所示:

      //Pass Empty string as line feed at the end
      CSVWriter writer = new CSVWriter(new FileWriter(archivoProductos), ',', 
                        CSVWriter.NO_QUOTE_CHARACTER,
                        CSVWriter.NO_ESCAPE_CHARACTER,"");
      

      【讨论】:

      • 感谢您一直以来的帮助!不幸的是,我现有的 3 行现在写在 1 行中。 @javaguy
      • 对不起,让我检查一下