【问题标题】:CSV parser using Scanner.useDelimiter("\r\n") to separate lines doesn't workCSV 解析器使用 Scanner.useDelimiter("\r\n") 分隔行不起作用
【发布时间】:2012-09-02 18:39:43
【问题描述】:

由于我们知道 CSV 文件内容的每一行使用\r\n 分隔,因此我们可以轻松获取每一行。代码如下:

scanner.useDelimiter("\r\n"); 
while(scanner.hasNext()){
    scanner.next();
}

但是如果CSV文件的一个字段里面有“\r\n”,那么这段代码就不起作用了!喜欢这里的 CSV:

Row1: "abc\r\nabc","abc","abc"
Row2: "efg", "efg", "efg"
Row3: "hjk", "hjk"

我想使用扫描仪读取:

"abc\r\nabc","abc","abc"
"efg", "efg", "efg"
"hjk", "hjk"

但如果只使用\r\n,结果会是:

“abc
abc","abc","abc"
"efg", "efg", "efg"
"hjk", "hjk"

我应该做些什么改变?如何修改scanner.useDelimiter("\r\n"),使模式可行?

【问题讨论】:

  • 分隔符不应该是“,”吗?
  • 我想用scanner来分隔行,首先我用的是bufferedreader,但是遇到"\n"就会停止,但是我刚刚发现scanner.useDelimiter("\r\n")也不能正常工作..因为在 CSV 的字段中可能包含“\r\n”。
  • "," 也可以在 CSV 的字段中。在我的代码中,我尝试先分隔行,读取 CSV 的每一行,然后在每一行字段中,使用其他模式分隔它们。
  • 如果 \r\n 在引号之间,那么它不是 csv 文件。

标签: java regex parsing csv


【解决方案1】:

首先,我建议您研究现有的 CSV 解析库。我想他们会很好地处理存在于您的字段分隔符 ("") 之间的任何内容,包括终止您的行的相同字符。请参阅相关问题:CSV API for Java

如果做不到这一点,我会尝试实施这个 SO 问题中提出的解决方案:Java: splitting a comma-separated string but ignoring commas in quotes

【讨论】:

  • "," 也可以在 CSV 的字段中。在我的代码中,我尝试先分隔行,读取每一行 CSV,然后在每一行字段中,使用其他模式将它们分开,我找到了一个非常有用的模式,但现在我的问题是我不能成功分开行..也许我的方式太愚蠢了..但无论如何谢谢。
  • @PengzhiZhou 我会强烈推荐你寻找一个 CSV 库。不要在这个上重新发明轮子!人们已经与这些问题作斗争并取得了成功。另请参阅我的答案中的新链接。
  • 感谢您的好意建议,实际上这是一个工作测试,我认为他们不希望看到我使用其他 CSV 库。
  • @PengzhiZhou 然后查看我添加到已编辑答案中的另一个链接。
  • 我已经读过那篇文章,这是我用来分隔每行字段的模式,但问题是我需要先读取一行字符串,然后我可以将该模式应用于用“,”分隔。我有一个 csv 文件,我需要先按行分隔,我只是不知道该怎么做。如果我直接使用该帖子的该模式来分隔整个文件,我将无法使用这些数据再次恢复该文件。
【解决方案2】:

推出自己的解决方案总是很诱人,但正是嵌入式换行符之类的问题使使用 CSV 库变得更加容易。

Super CSV 适合嵌入的换行符(它是 compliant with RFC4180 - CSV 的 MIME 类型定义),以及嵌入的引号和分隔符(均可配置)。除了能够读入 List、Map 或 POJO,您还可以定义 processors 来转换或验证您的数据,当出现问题时,您将获得更多信息(行号、行号、列号码等)。

我们(Super CSV 团队)刚刚发布了一个 new version,它带来了许多改进和错误修复以及一个使用 Dozer 在 CSV 文件和 POJO 之间映射的 powerful new extension

它适用于 SourceForge 或 Maven 上的 download

【讨论】:

    【解决方案3】:

    你可以试试分隔符:

     "\"\r\n\""
    

    如果每一行都以 " 开头和结尾,它应该可以工作。尽管如果您的一个字符串包含 只是一个换行符,它仍然会被破坏。

    【讨论】:

    • 此分隔符找不到任何匹配项,只能在一个字符串中获取整个文件。似乎在每个换行符 \r\n 中,我认为它们不会被“”包围。我也在我的代码中测试过,对不起它不起作用
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多