使用opencsv的@CsvBindByPosition为何仅能读取单列数据?
问题原因
你的CSV文件使用**分号;**作为列分隔符,但opencsv 5.3的默认分隔符是逗号,,这导致解析时无法正确拆分列:
- 使用
@CsvBindByPosition时,整行被识别为单个字段,只有position=0的字段能获取到值,其余字段自然为null; - 使用
@CsvBindByName时,因列拆分失败,无法匹配表头与实体类字段,所有字段均为null。
解决方案
1. 针对@CsvBindByPosition的修复
在构建CsvToBean时显式指定分号作为分隔符即可:
List<ABC> beans = new CsvToBeanBuilder(new FileReader("etestcsv")) .withType(ABC.class) .withSeparator(';') // 指定CSV的分隔符为分号 .build() .parse();
2. 针对@CsvBindByName的修复
除了指定分隔符,还需要确保实体类字段与CSV表头精准匹配(表头包含特殊字符、空格,需显式指定列名):
修改后的实体类ABC:
public class ABC { @CsvBindByName(column = "Prozess") private String prozess; @CsvBindByName(column = "Rüstvorgang") private String ruestVorgang; @CsvBindByName(column = "Prozessdauer Minuten") private String prozessDauerMinuten; @CsvBindByName(column = "Station") private String station; @CsvBindByName(column = "Küvettentyp") private String kuevettenTyp; @CsvBindByName(column = "Küvettentemperatur Grad Celsius") private String kuevettenTemperatur; @CsvBindByName(column = "Werker") private String werker; @CsvBindByName(column = "Gasmischung") private String gasMischung; @CsvBindByName(column = "GasKonzentration PPM") private String gasKonzentration; // 必须添加getter和setter方法,opencsv依赖这些方法赋值 public String getProzess() { return prozess; } public void setProzess(String prozess) { this.prozess = prozess; } // 其余字段的getter/setter同理补充 }
修改后的构建代码:
List<ABC> beans = new CsvToBeanBuilder(new FileReader("etestcsv")) .withType(ABC.class) .withSeparator(';') .build() .parse();
额外注意事项
- 确保实体类字段有对应的
getter/setter方法,openccsv默认通过setter方法为字段赋值; - 如果CSV表头与实体类字段名仅大小写差异,可添加
withIgnoreCase(true)配置简化映射,但表头含特殊字符或空格时,显式指定列名更可靠。
内容的提问来源于stack exchange,提问作者emoleumassi
相关产品推荐
相关产品推荐

