使用Jakarta Commons CSV解析CSV时遇IOException异常求助
解决Jakarta Commons CSV解析时出现的"invalid char between encapsulated token and delimiter"异常
你碰到的这个报错,核心原因是CSV字段内的双引号没有遵循标准的转义规则。咱们先拆解下问题所在:
你的示例第二行里,Field1的内容是"Ryan, R"u"bianes"——这里面的R"u部分用了单个双引号,但CSV标准(RFC 4180)明确规定:如果字段里要包含双引号,必须用两个连续的双引号来表示一个实际的双引号。解析器看到这个单个双引号时,会误以为这是当前字段的结束标记,后面的内容就会被当成未被引号包裹的内容,和后续的逗号分隔符冲突,直接抛出异常。
下面给你两个可行的解决方案:
方案1:修正CSV输入文件(推荐,符合标准)
把字段内的单个双引号替换成两个连续的双引号,修正后的第二行应该是这样:
"Ryan, R""u""bianes"," dummy@gmail.com","29445","626","South delhi, Rohini 122001"
用你原来的解析配置就能正常工作,解析后完全能得到你期望的结果:
- Field1的值:
Ryan, R"u"bianes - Field5的值:
South delhi, Rohini 122001
方案2:调整解析器配置(适用于无法修改输入的场景)
如果实在没办法修改输入文件,你可以给CSVFormat添加转义字符配置,指定用双引号自身来转义:
CSVFormat format = CSVFormat.newFormat(',') .withIgnoreEmptyLines() .withQuote('"') .withEscape('"'); // 让双引号作为转义字符处理
不过要注意,这个配置不符合标准CSV规范,可能会在处理其他标准CSV内容时出问题,所以优先推荐方案1。
内容的提问来源于stack exchange,提问作者Emperor
相关产品推荐
相关产品推荐

