You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Apache Commons CSV解析时,如何处理含换行符的带引号字段?

解决Apache Commons CSV解析时记录数异常的问题

我来帮你梳理清楚问题根源和对应的解决方案:

问题到底出在哪?

你设置了.withQuote(null),这会直接禁用CSVParser对引号的解析逻辑。原本被双引号包裹的字段(里面包含换行符\n或者字段分隔符逗号),会因为引号被忽略,导致里面的换行符被当成了记录分隔符、逗号被当成字段分隔符,自然就把一个完整字段拆成了多个记录/字段,最终记录数就异常增多了。

之前你用这个配置解决了字段含分隔符的问题,其实是个误打误撞的“歪招”——正确的做法应该是利用引号的包裹功能来处理含分隔符的字段,而不是直接禁用引号解析。

正确的解决方案

恢复CSVFormat对引号的默认处理逻辑,不要设置withQuote(null)。因为RFC4180标准本身就规定:包含字段分隔符、换行符的字段应该用双引号包裹,CSVParser会自动识别引号内的内容为完整字段,不会把里面的逗号或换行当成分隔符。

修正后的代码如下:

CSVParser parser = CSVParser.parse(reader, CSVFormat.RFC4180.withFirstRecordAsHeader());

如果你的CSV里字段前后有多余空格(比如示例里的 test 4),可以额外加上.withIgnoreSurroundingSpaces(true)来自动忽略:

CSVParser parser = CSVParser.parse(reader, CSVFormat.RFC4180
    .withFirstRecordAsHeader()
    .withIgnoreSurroundingSpaces(true));

效果验证

对于包含换行符的字段(比如test,"test test 2\nline break",test 3,test 4),用上面的配置解析后,第二个字段会被完整解析为test test 2\nline break,不会被拆分成多个记录,记录数就和实际一致了。

内容的提问来源于stack exchange,提问作者piyush gajjariya

火山引擎 最新活动