OpenCSV读取CSV时行尾含引号致跨行读取问题求助
问题:OpenCSV读取含转义引号的CSV时出现行合并异常
给定CSV内容:
id,name,address,city ABC,"DE""F",HIJ,"KLM""N" OPQ,RST,"U""V","WXYZ"""
使用OpenCSV读取时,city字段会错误包含下一行内容,例如第一条记录的city字段值变为:
KLM"N OPQ,RST,U etc.
其中OPQ本应是第二条记录的id。尝试设置withQuoteChar('"')无效,求解决方法。
已尝试的代码
方式一:基础CSVReader
csvReader = new CSVReader(new InputStreamReader(inputStream)); String[] record = csvReader.readNext(); while ((record = csvReader.readNext()) != null) { MyEntity entity = new MyEntity(); entity.setID(record[0]); entity.setName(record[1]); entity.setAddress(record[2]); entity.setCity(record[3]); }
方式二:CSVReaderBuilder配置QuoteChar
try (CSVReader csvReader = new CSVReaderBuilder(new InputStreamReader(inputStream)) .withCSVParser(new CSVParserBuilder().withQuoteChar('"').build().build()){}
解决方案
问题出在CSV的转义字符配置:你的CSV使用双引号自身作为转义符(比如"DE""F"表示DE"F),但OpenCSV默认转义字符是反斜杠\,导致它认为"KLM""N"是未闭合的引号,会持续读取下一行直到找到匹配的闭合引号。
正确的做法是同时设置QuoteChar和EscapeChar为双引号,修正后的代码如下:
try (CSVReader csvReader = new CSVReaderBuilder(new InputStreamReader(inputStream)) .withCSVParser(new CSVParserBuilder() .withQuoteChar('"') .withEscapeChar('"') // 关键:设置转义字符为双引号 .build()) .build()) { String[] header = csvReader.readNext(); // 读取表头 String[] record; while ((record = csvReader.readNext()) != null) { MyEntity entity = new MyEntity(); entity.setID(record[0]); entity.setName(record[1]); entity.setAddress(record[2]); entity.setCity(record[3]); // 处理entity逻辑 } } catch (IOException e) { e.printStackTrace(); }
说明
withQuoteChar('"'):指定字段的包裹字符为双引号withEscapeChar('"'):指定字段内的双引号用自身转义,这样OpenCSV能正确识别"KLM""N"是单个字段值KLM"N,不会误判为未闭合的引号而读取下一行内容
内容的提问来源于stack exchange,提问作者Madmax1811
相关产品推荐
相关产品推荐

