使用Scanner.useDelimiter(“\ r \ n”)来分隔行的CSV解析器不起作用

时间:2012-09-09 20:05:42

标签: java regex parsing csv

由于我们知道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")以使模式可行?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

它适用于SourceForge或Maven上的download

答案 2 :(得分:0)

您可以尝试分隔符:

 "\"\r\n\""
如果每一行以开头和结尾,

应该可以工作。虽然如果你的一个字符串包含只是换行符,它仍会被破坏。