当前位置: 首页 > 知识库问答 >
问题:

如何将列表写入csv文件

慕容宇
2023-03-14

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

示例类:

public class Employee {
    private String name;

    private int empId;

    List<String> phoneNumbers;
}

我得到的结果是:

name,empId,phoneNumbers
vijay,1,"[123, 456]"

注意列表

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

我试过使用CsvBeanReader

我得到了非法辩论的例外。感谢你的指点!

完整代码

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();
    }


}
}

共有1个答案

司徒兴德
2023-03-14

你所依赖的事实是,你的电话号码列表是使用列表的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]" };
  • 我已经定义了两个电话号码栏——如果你的列表中有更多的电话号码栏,那么只需添加更多的栏
  • 我本可以使用fieldMapping作为标题,但选择使用更可读的自定义标题
  • 你不应该像在问题中那样需要提示
  • 我使用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]]
 类似资料:
  • 问题内容: 我有一长串以下形式的清单- 即列表中的值是不同的类型-浮点数,整数,字符串。如何将其写入csv文件,以便输出的csv文件看起来像 问题答案: Python的内置CSV模块可以轻松处理此问题: 假设您的问题中的清单定义为。您可以通过各种可选参数来调整输出CSV的确切格式,如上面链接的库参考页中所述。 Python 3更新

  • 我正在编写一个python程序,可以循环reddit提交,提取数据,并将其作为对象存储在列表中。但是,我在将该列表写入csv文件时遇到困难。文件已创建,但它只是为对象提供某种id标记。我应该如何更改csv代码? 代码 CSV文件

  • 问题内容: 我正在努力将列表字典写入.csv文件。 这是我的字典的样子: 我希望.csv文件看起来像: 首先,我写标题: 到目前为止很好…但是,我的问题是我不知道如何将一个列表分配给相应的列。例如: 将随机填充列。另一个问题是,我必须手动填写键,并且不能将其用于具有4个键的另一本词典。 问题答案: 如果您不关心列的顺序(因为字典是无序的),则可以简单地使用: 结果: 如果您确实关心订单,则需要对键

  • 我有一个长长的列表,列表的形式如下--- i、 列表中的值有不同的类型——float、int、string。如何将其写入csv文件,使输出的csv文件看起来像

  • 问题内容: 我有5个长度相同的列表,我想将它们写到CSV的5列中。到目前为止,我只能使用以下代码将一个代码写入一列: 如果我添加另一个循环,它只会将该列表写入同一列。有人知道获得五个单独列的好方法吗? 问题答案: 将它们更改为行 然后就

  • 我有5个相同长度的列表,我想把它们写在CSV的5列中。到目前为止,我只能用以下代码在一列中写一个: 如果我为循环添加另一个