Java SuperCSV-将多个列解析为一个列表
给定以下示例csv数据Java SuperCSV-将多个列解析为一个列表,java,csv,supercsv,Java,Csv,Supercsv,给定以下示例csv数据 姓名、地址、兄弟姐妹、兄弟姐妹、兄弟姐妹 约翰、梅斯特、莎拉、迈克、格雷格 还有我想要解析数据的示例POJO public class Employee { private String name; private String address; private List<String> siblings; public Employee() { } public void setName(String name) { .
姓名、地址、兄弟姐妹、兄弟姐妹、兄弟姐妹
约翰、梅斯特、莎拉、迈克、格雷格
还有我想要解析数据的示例POJO
public class Employee {
private String name;
private String address;
private List<String> siblings;
public Employee() { }
public void setName(String name) { ... }
public void setAddress(String address { ... }
public void setSiblings(List<String> siblings) { ... }
}
以及以下单元处理器
CellProcessors[] processors = new CellProcessors[]{
new NotNull(), // name
new NotNull(), // address
new NotNull(), // siblings[0]
new NotNull(), // siblings[1]
new NotNull() // siblings[2]
}
我希望能够毫无问题地将csv数据解析为Employee
,但是我收到以下异常
org.supercsv.exception.SuperCsvReflectionException:在com.Employee类中找不到方法setSiblings[0](java.lang.String)-检查相应的nameMapping元素是否与bean中的字段名匹配,并且单元处理器返回与字段兼容的类型
这就是我进行实际解析的方式
List<Employee> deserializedRecords = new ArrayList<>();
try (ICsvBeanReader beanReader = new CsvBeanReader(new FileReader(file), CsvPreferences.STANDARD_PREFERENCE)) {
beanReader.getHeader(true);
Employee model;
while ((model = (Employee) beanReader.read(Employee.class, fieldMapping, processors)) != null) {
deserializedRecords.add(model);
}
}
List反序列化记录=new ArrayList();
try(ICsvBeanReader beanReader=new CsvBeanReader(new FileReader(file),CsvPreferences.STANDARD_首选项)){
beanReader.getHeader(true);
员工模式;
而((model=(Employee)beanReader.read(Employee.class,fieldMapping,processors))!=null){
反序列化记录。添加(模型);
}
}
这在很大程度上遵循了给出的答案,在阅读SuperCSV文档之后,我不完全确定引发异常的原因。您使用的是不支持索引(或深度)映射的CsvBeanReader
。您正在寻找CsvDozerBeanReader
(示例)
List<Employee> deserializedRecords = new ArrayList<>();
try (ICsvBeanReader beanReader = new CsvBeanReader(new FileReader(file), CsvPreferences.STANDARD_PREFERENCE)) {
beanReader.getHeader(true);
Employee model;
while ((model = (Employee) beanReader.read(Employee.class, fieldMapping, processors)) != null) {
deserializedRecords.add(model);
}
}