使用univocity-parsers解析含反斜杠转义引号的CSV遇解析异常
问题
使用univocity-parsers解析带反斜杠转义引号(\")的CSV文件时,仅含单个转义引号的行能正常解析,包含两个转义引号的行解析异常。
CSV示例(每行4列)
1,,No quote escape,test 2,,"One quote escape\"",test 3,,"Two \"quote escapes\"",test 4,,"Two \"quote escapes\" 2",test
当前解析器配置
CsvFormat: Comment character=# Field delimiter=, Line separator (normalized)=\n Line separator sequence=\r Quote character=" Quote escape character=\\ Quote escape escape character=null
现有代码片段
CsvParserSettings settings = new CsvParserSettings(); settings.setDelimiterDetectionEnabled(true); settings.setLineSeparatorDetectionEnabled(true); settings.getFormat().setQuote('"'); settings.getFormat().setQuoteEscape('\\\\'); CsvParser parser = new CsvParser(settings); parser.beginParsing(file, StandardCharsets.UTF_8); ...
期望解析结果
- 1,null,No quote escape,test
- 2,null,One quote escape",test
- 3,null,Two "quote escapes",test
- 4,null,Two "quote escapes" 2,test
解决方案
问题根源在于转义字符的设置错误,以及未启用Quote escape escape character配置。
修正后的代码
CsvParserSettings settings = new CsvParserSettings(); settings.setDelimiterDetectionEnabled(true); settings.setLineSeparatorDetectionEnabled(true); CsvFormat format = settings.getFormat(); format.setQuote('"'); format.setQuoteEscape('\\'); // Java中单个反斜杠需用\\转义,此处设置转义字符为\ format.setQuoteEscapeEscape('\\'); // 关键配置:让解析器正确识别连续的转义引号序列 CsvParser parser = new CsvParser(settings); parser.beginParsing(file, StandardCharsets.UTF_8);
配置说明
- 修正
Quote escape character:原代码中setQuoteEscape('\\\\')会导致解析器把\\\\当作转义字符,实际应设置为'\\',对应CSV中的\作为引号转义符。 - 启用
Quote escape escape character:将其设置为和转义字符相同的'\\',解析器就能正确处理\"\"这类连续转义序列,将其转换为两个普通引号,而非误判为字段结束符。
内容的提问来源于stack exchange,提问作者pcenta
相关产品推荐
相关产品推荐

