CSVMapper与CSVSchema解析含引号CSV文件抛出错误如何解决
问题原因
该报错是由于你使用的CSV文件不符合RFC4180标准的双引号转义规则导致的:
- 被双引号包裹的字段如果内部需要使用双引号,标准要求必须用两个连续的双引号(
"")做转义,或者明确指定统一的转义字符(如反斜杠\) - 你提供的报错行中存在大量未转义的字段内双引号,例如
"abc def ghijkl, abcdef abcd abc., efg, 8 "hi. jk. lmnopqrst" abcd, we-2636 abcdffe, bulgaria"这段,Jackson读取到8后的单个双引号时,会判定当前字段已经结束,预期后续是分隔符|或者行尾,因此遇到后续的普通字符就抛出解析异常 - 你之前测试的
Aple \"Abcd Abcd Abcdefghijk\"可以正常解析,是因为这段内容的内部双引号用了反斜杠转义,而实际报错行的内部双引号没有转义标记。
解决方案
根据你不能禁用引号解析的约束(需要识别包裹了|的字段),可以按优先级选择以下方案:
- 方案1:修复CSV生成逻辑(优先推荐)
要求生成该CSV的程序按照标准规则处理双引号:所有字段内部的双引号统一替换为两个连续的双引号,例如原内容8 "hi. jk."修改为8 ""hi. jk."",即可直接用你现有的配置正常解析。 - 方案2:新增转义字符配置(适用于CSV内双引号用反斜杠转义的场景)
如果你实际CSV中的内部双引号已经用反斜杠做了转义,只是示例里没有展示转义符,只需要在现有配置中新增一行指定转义字符即可:csvSchema = csvMapper.schemaFor(User.class) .withUseHeader(true) .withColumnSeparator("|") .withQuoteChar('"') .withEscapeChar('\\'); // 新增指定反斜杠为转义字符 - 方案3:自定义解析逻辑(适用于无法修改CSV源、且CSV无统一转义规则的场景)
如果CSV源完全不遵循转义规则且无法调整,可以先按分隔符|拆分整行内容,再自行处理每个字段的引号:- 拆分后判断每个字段是否以
"开头且以"结尾,符合则去除首尾的双引号 - 按业务规则处理字段内部的双引号即可,不需要依赖Jackson的自动引号识别逻辑。
- 拆分后判断每个字段是否以
内容的提问来源于stack exchange,提问作者Braham Shakti
相关产品推荐
相关产品推荐

