如何解决OpenCSV BeanToCsv转换时Java Bean字段换行拆分问题
解决方法
核心问题是你设置了CSVWriter.NO_QUOTE_CHARACTER,而CSV规范要求:包含换行符、逗号等特殊字符的字段必须用引号包裹,否则会破坏CSV结构。
方案1:移除禁用引号的配置
OpenCSV默认会自动识别含特殊字符(换行符、逗号、引号等)的字段,并自动为其添加引号包裹。去掉withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)后,工具会自动处理特殊字段,确保包含换行符的字段被正确包裹,不会拆分行。
修改后的代码:
ArrayList list = new ArrayList<>(); CustomerAttribute attr1 = new CustomerAttribute().setAttributeId(123).setAttributeValue("abc,\nbcd"); CustomerAttribute attr2 = new CustomerAttribute().setAttributeId(123).setAttributeValue("abc"); list.add(attr1); list.add(attr2); HeaderColumnNameMappingStrategy<CustomerAttribute> strategy = new HeaderColumnNameMappingStrategy<>(); strategy.setType(CustomerAttribute.class); Writer writer = new FileWriter("sample.csv", StandardCharsets.UTF_8); StatefulBeanToCsv<CustomerAttribute> build = new StatefulBeanToCsvBuilder<CustomerAttribute>(writer) .withMappingStrategy(strategy) .build();
方案2:自定义引号规则(若业务需要)
如果必须自定义引号字符而非完全禁用,可以设置合法的引号字符(比如默认的"),同时保留OpenCSV的自动引号策略。若需要更精细的控制,可通过withQuoteStrategy配置规则:
StatefulBeanToCsv<CustomerAttribute> build = new StatefulBeanToCsvBuilder<CustomerAttribute>(writer) .withMappingStrategy(strategy) .withQuotechar('"') // 显式设置默认引号字符,可替换为业务允许的其他字符 .build();
处理后,包含换行符的字段会被引号包裹,生成的CSV结构正确,解析时不会报错。
内容的提问来源于stack exchange,提问作者Roger Xing
相关产品推荐
相关产品推荐

