由于我们知道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")
以使模式可行?
答案 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\""
如果每一行以“开头和结尾,应该可以工作。虽然如果你的一个字符串包含只是换行符,它仍会被破坏。