使用CSVParser/CSVReader解析CSV时遭遇未终止引号字段异常
问题描述
使用CSVParser和CSVReader解析CSV文件时,遇到末尾带多个分号的行解析失败,抛出Unterminated quoted field at end of CSV line异常。相关代码及测试数据如下:
代码片段
char QUOTE = '"'; InputStreamReader reader = new InputStreamReader(content); CSVParser csvParser = new CSVParserBuilder() .withSeparator(";".charAt(0)) .withQuoteChar(QUOTE) .build(); CSVReader csvReader = new CSVReader(reader);
测试CSV行
"GGDIRECT";"ARCIT_TEST_1";"Test table for ArcIt";500;;;
抛出异常
java.io.IOException: Unterminated quoted field at end of CSV line
解决方法
关联自定义解析器到CSVReader
你构建了自定义分隔符和引号规则的CSVParser,但初始化CSVReader时未传入该解析器,导致CSVReader使用默认的逗号分隔符规则解析,这是核心问题之一。正确初始化方式:CSVReader csvReader = new CSVReaderBuilder(reader) .withCSVParser(csvParser) .build();配置解析器兼容末尾空字段
针对末尾多分隔符的场景,需要给CSVParser添加额外配置,避免把末尾的空字段误判为未闭合的引号字段:CSVParser csvParser = new CSVParserBuilder() .withSeparator(";".charAt(0)) .withQuoteChar(QUOTE) .withAllowMissingColumnNames(true) // 允许列数不匹配的行 .withTrim(false) // 保留空字段,不自动忽略 .build();检查QUOTE变量定义
如果你的代码中QUOTE实际是char QUOTE = '""';,这会导致编译错误(单个char变量无法存储两个字符),正确定义应为char QUOTE = '"';。
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

