Java 如何编写列表<;字符串>;到csv文件&;使用supercsv将其读回

Java 如何编写列表<;字符串>;到csv文件&;使用supercsv将其读回,java,csv,supercsv,Java,Csv,Supercsv,我使用supercsv CsvBeanWriter将值写入csv文件 示例类: public class Employee { private String name; private int empId; List<String> phoneNumbers; } 注意列表电话号码是如何在[] 我的问题是如何使用supercsv将其读回Employee类(bean) 我尝试使用CsvBeanReader和CsvDozerBeanReader,但无法读取列

我使用supercsv CsvBeanWriter将值写入csv文件

示例类:

public class Employee {
    private String name;

    private int empId;

    List<String> phoneNumbers;
}
注意
列表电话号码是如何在
[]

我的问题是如何使用supercsv将其读回Employee类(bean)

我尝试使用
CsvBeanReader
CsvDozerBeanReader
,但无法读取
列表

我收到非法辩论异常。 我会感谢你的指点

完整代码:

public class DozerBeanReader {
public static void main(String [] args){
    ICsvDozerBeanReader beanReader = null;

    try {
        beanReader = new CsvDozerBeanReader(new FileReader("Employee.csv"), 
                CsvPreference.STANDARD_PREFERENCE);

        String [] header = beanReader.getHeader(true); // ignore the header

        Class<?> [] hintTypes = {String.class, Integer.class, List.class};

        beanReader.configureBeanMapping(Employee.class, header, hintTypes);

        Employee readEmp1 = beanReader.read(Employee.class);
        readEmp1.toString();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}
}
公共类DozerBeanReader{
公共静态void main(字符串[]args){
ICsvDozerBeanReader beanReader=null;
试一试{
beanReader=新的CsvDozerBeanReader(新的文件阅读器(“Employee.csv”),
CSVP(参考。标准优先);
String[]header=beanReader.getHeader(true);//忽略头
类[]hintTypes={String.Class,Integer.Class,List.Class};
beanReader.configureBeanMapping(Employee.class、header、hintTypes);
Employee readEmp1=beanReader.read(Employee.class);
readEmp1.toString();
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}

您所依赖的事实是,您的电话号码列表是使用列表的
toString()
格式,例如
[123456]
写入一个CSV列的

您将得到如下异常:

org.dozer.MappingException: Illegal object type 
for the method 'setPhoneNumbers'. 
Expected types: 
java.util.List
Actual types: 
java.lang.String
因为推土机不知道如何将字符串
[123456]
转换为
列表。您可以这样做,但需要编写一个将该字符串转换回
列表的函数。如果你的电话号码纯粹是数字,这应该不会太难,但如果你的电话号码有逗号,那么事情就会变得一团糟

我建议将每个电话号码单独列出来,这样做会更容易(对于任何阅读您的文件的人,包括您!)

您所需要做的就是将CsvDozerBeanReader和CsvDozerBeanWriter与一起使用

下面是一个示例-关键部分是索引映射:

String[] fieldMapping = new String[] { "name",
    "empId", "phoneNumbers[0]", "phoneNumbers[1]" };
  • 我已经定义了两个电话号码列-如果您的列表中有更多的电话号码,那么只需添加更多的列即可
  • 我本可以使用字段映射作为标题,但选择使用更可读的自定义标题
  • 你不应该像在你的问题中那样需要提示
  • 我使用StringReader/StringWriter只是为了简化示例
例如:

// create employee to write/read
Employee employee = new Employee();
employee.setEmpId(1234);
employee.setName("Vijay");
employee.setPhoneNumbers(Arrays.asList("123", "456"));

// the CSV header
String[] header = new String[] { "name",
    "empId", "phoneNumber1", "phoneNumber2" };

// the field mapping
String[] fieldMapping = new String[] { "name",
    "empId", "phoneNumbers[0]", "phoneNumbers[1]" };

// write the employee
StringWriter out = new StringWriter();
ICsvDozerBeanWriter writer = 
    new CsvDozerBeanWriter(out,
    CsvPreference.STANDARD_PREFERENCE);
writer.configureBeanMapping(Employee.class, fieldMapping);
writer.writeHeader(header);
writer.write(employee);
writer.flush();

// read the employee
ICsvDozerBeanReader reader = 
    new CsvDozerBeanReader(new StringReader(out.toString()),
    CsvPreference.STANDARD_PREFERENCE);
reader.configureBeanMapping(Employee.class, fieldMapping);
reader.getHeader(true); // ignore header
Employee e = reader.read(Employee.class);
System.out.println(e);
假设您已经编写了
toString()
方法,应该会打印出来

Employee [name=Vijay, empId=1234, phoneNumbers=[123, 456]]

当我不知道列表中有多少元素时,知道如何设置String[]fieldMapping吗?
Employee [name=Vijay, empId=1234, phoneNumbers=[123, 456]]