【问题标题】:How to Read csv file with line breaks when "\r\n" does not work当“\r\n”不起作用时如何读取带有换行符的csv文件
【发布时间】:2018-07-01 11:57:58
【问题描述】:

我是 Java 新手,一直在阅读 Java 文档和其他线程 (1,2) 但无法使其工作。

基本上我的 csv 文件几乎没有这样的记录

How are
you

所以我希望我的代码将其作为一行来阅读

How are you

我的代码如下所示:

BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"utf-8"));

    while ((line = bReader.readLine()) != null) {
        String lines = line.replaceAll("\r\n", " ");
        System.out.println(lines);

手动地,当我在you按退格键时,它会返回are,然后我按了空格键。然后就好了。但我有一个包含 29k 记录的大 csv 文件。必须有一种方法可以解决这个问题。你能指点我的方向吗?谢谢。

[编辑]

这就是它的外观。

Fav: Beaver tails.
Least fav: HST not included in prices.

编辑2:

-3166,1054,CF ,5992841,15:37.5,en,13007,12,12,Comments: Favorite and/or least favorite things,0,"Cafe Fun
-Least favourite - cabs"

“Cafe Fun Least Favourite - cabs”应该在同一行。

【问题讨论】:

  • 这不是对所有人都有效吗?还是只有少数人?
  • 正确处理 CSV 很棘手,尤其是在处理引号字段时。不要编写自己的 CSV 阅读器,使用现有的调试 CSV 库之一。
  • @JimGarrison 你能推荐几个吗?我也去谷歌一下。
  • 查找 OpenCSV 或 Apache Commons CSV
  • @matt 我有这样的单元格。我将尝试 Apache Commons csv 并尝试一下。

标签: java replaceall


【解决方案1】:

readLine() 将返回文件中的下一行,不带行分隔符。因此,在循环的第一次迭代中,lines"How are",而在第二次迭代中,lines"you"。这些都不包含"\r\n",因此您对replaceAll(...) 的调用只会返回相同的字符串。

然后,System.out.println(...) 打印文本并附加一个行分隔符,这样你就可以回到开始的状态。

您可以将所有行收集到一个列表中:

List<String> lines = Files.readAllLines(csv);

然后使用String.join(...) 连接它们:

String allLines = String.join(" ", lines);

【讨论】:

  • @Sweeper 在这种情况下,是的。我读到“我的文件几乎没有记录”,意思是该文件只有几行。
  • @Sweeper "readLine" 可能会将整个文件加载到内存中并导致内存不足错误。
【解决方案2】:

BufferedReader.readLine() 不读取换行符,因此您的字符串 lines 没有刹车。
您只需使用 System.out.println(lines); 打印换行符,将其更改为 System.out.print(lines); 并在 while 循环后调用 System.out.println();

BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"utf-8"));

while ((line = bReader.readLine()) != null) {
    System.out.print(line);
}
System.out.println();

【讨论】:

    【解决方案3】:

    开始 csv(顾名思义)是用逗号分隔的文件,而不是空格。但忘了这一点,readLine 只读取“指针”所在的行,在这种情况下,“你”在另一行而不是“如何”。我认为这就是你的问题所在。解决它的一种方法是使用 StringBuilder 和“附加(字符串)”。它正在将所有内容加在一起。问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多