You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:32:40