1

由于我们知道 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,结果会是:</p>

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

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

4

3 回答 3

1

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

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

于 2012-09-09T20:15:35.537 回答
1

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

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

我们(Super CSV 团队)刚刚发布了一个新版本,它带来了许多改进和错误修复以及一个强大的新扩展,它使用 Dozer 在 CSV 文件和 POJO 之间进行映射。

它可以在 SourceForge 或 Maven 上下载。

于 2012-09-19T22:23:43.663 回答
0

您可以尝试分隔符:

 "\"\r\n\""

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

于 2012-09-09T20:16:36.553 回答