使用opencsv解析CSV时末尾双引号丢失,如何配置保留?
问题描述
在Java中使用opencsv读取CSV文件时,出现字段末尾双引号丢失的问题。读取器配置代码如下:
try (Reader reader = Files.newBufferedReader(pathToFile)) { CSVParser parser = new CSVParserBuilder().withSeparator(";").build(); try (CSVReader csvReader = new CSVReaderBuilder(reader).withSkipLines(1) .withCSVParser(parser).build()) { List<String[]> csvFileData = csvReader.readAll(); .... }}
CSV文件中的目标行内容:
123;00234;123;Max "Mustermann";something
解析后对应字段的结果:
Max "Mustermann
字段末尾的双引号消失,尝试配置withIgnoreQuotations(true)后仍无效果,需确认是否可通过CSVParser配置保留字段末尾的双引号。
解决方案
要完整保留字段中的双引号,需调整CSVParser的两项核心配置:
- 禁用引号解析逻辑:
withIgnoreQuotations(true)是禁用引号解析的基础,但仅靠此配置不够——opencsv默认将双引号(")识别为字段包裹符,仍会对其做特殊处理。 - 替换默认引号字符:将引号字符设置为CSV文件中不会出现的特殊字符(例如空字符
'\0'),让解析器彻底放弃对双引号的特殊处理。
修改后的Parser配置代码如下:
CSVParser parser = new CSVParserBuilder() .withSeparator(';') .withIgnoreQuotations(true) .withQuoteChar('\0') // 设置为无意义的空字符,彻底禁用引号解析逻辑 .build();
配置完成后,opencsv会将所有内容视为普通文本,不会自动去除字段中的双引号,即可完整保留Max "Mustermann"中的末尾双引号。
注意:如果CSV文件中存在合法的双引号包裹字段场景,此配置会破坏原有解析逻辑,但针对当前场景,该方案完全适用。
内容的提问来源于stack exchange,提问作者deadpoint
相关产品推荐
相关产品推荐

