使用Apache Commons CSVParser时,如何转义CSV中String[]数组内的逗号?
解决Apache Commons CSV解析含数组的CSV字段时逗号被拆分的问题
你遇到的核心问题是禁用了CSV的引号功能,导致包含逗号的字段无法被正确识别为单个字段。咱们一步步来解决:
为什么你的代码没生效?
你设置了.withQuote(null),这相当于告诉CSVParser:"不要用引号来识别包含分隔符的字段"。所以哪怕你把数组内容用引号包起来,Parser也会把里面的逗号当成字段分隔符来拆分,自然就出错了。
正确的做法
1. 保留默认的引号规则(去掉withQuote(null))
CSVFormat.DEFAULT默认用双引号作为字段的包裹符,当字段里包含分隔符(逗号)时,只要用双引号把整个字段包起来,Parser就会把它当成单个字段处理。而字段内的双引号需要用两个双引号转义,这部分你已经做对了。
2. 调整后的代码示例
@Test public void processLine() throws Exception { // 定义CSV分隔符(假设你用的是逗号,如果是其他符号替换即可) char CSV_SEPARATOR = ','; String line = "Ids,Info.name,Info.number,address.street,address.number,address.bus,address.postalcode,address.city,address.country\n" + "\"[\"\"54bb051e-3d12-11e5-91cd-b8f6b11b7feb\"\",\"\"472a9748-3d12-11e5-91cd-b8f6b11b7feb\"\"]\",Hallo,114058,Leon,31,\" \",8400,foo,BAR"; CSVParser csvParser = CSVFormat.DEFAULT .withDelimiter(CSV_SEPARATOR) .withFirstRecordAsHeader() .parse(new StringReader(line)); // 遍历记录 for (CSVRecord record : csvParser) { String idsField = record.get("Ids"); System.out.println("完整的Ids字段:" + idsField); // 接下来把字段转换成String数组 String[] ids = convertIdsFieldToArray(idsField); // 打印结果 System.out.println("转换后的数组:"); for (String id : ids) { System.out.println("- " + id); } } } // 辅助方法:把包裹的字段内容转换成String数组 private String[] convertIdsFieldToArray(String idsField) { // 去掉前后的方括号和外层的双引号 String cleaned = idsField.replaceAll("^\"\\[\"|\"\\]$", ""); // 按转义后的双引号+逗号+双引号分割 return cleaned.split("\"\",\"\""); }
3. 关键说明
- 字段
"[\"\"id1\"\",\"\"id2\"\"]"会被Parser正确识别为单个字段,解析后内容为["id1","id2"](转义的双引号会自动还原为单个双引号)。 - 辅助方法
convertIdsFieldToArray负责把字符串格式的数组转换成Java String数组,处理掉外层的包裹符号后,按分隔符拆分即可。
额外优化(可选)
如果你觉得手动处理字符串麻烦,可以用JSON解析库(比如Jackson)直接把字段内容转换成数组,代码更简洁且能适配复杂场景:
// 需提前引入Jackson依赖 ObjectMapper mapper = new ObjectMapper(); String[] ids = mapper.readValue(idsField, String[].class);
内容的提问来源于stack exchange,提问作者Jo Van Montfort
相关产品推荐
相关产品推荐

