【问题标题】:Why does writing a bean to CSV file fail with OpenCSV (5.6 or 5.7)?为什么使用 OpenCSV(5.6 或 5.7)将 bean 写入 CSV 文件会失败?
【发布时间】:2022-12-03 00:39:33
【问题描述】:

我在 5.6 版中使用 OpenCSV,并遵循示例 https://www.geeksforgeeks.org/mapping-java-beans-to-csv-using-opencsv/ 但无法将我的写入 csv 文件。

public static void main(String[] args){
    List<MyPartbean> mybeans = new List<MyPartbean>();
    MyPartbean b1 = new MyPartbean("123", "Red");
    MyPartbean b2 = new MyPartbean("456", "Blue");
    
    mybeans.add(b1);
    mybeans.add(b2);
    
    file_location = "/tmp/out.csv";
    String[] columns = new String[]{"Number", "Description"};
    CSVUtils.writeToCSV(String file_location, MyPartbean.class,
      mybeans, columns)
}

豆:

public class MyPartbean extends HashMap {
  String number="";
  String description="";
  public MyPartbean(String number, String desc){
     this.number = number;
     this.description = desc;
  }
  public void setNumber(String number){ this.number = number;}
  public void setDescription(String description){ this.description = description;}
  public String getNumber() {return number;}
  public String getDescription() {return description;}
  
}

写入 CSV:

public class CSVUtils {
  public static void writeToCSV(String file_location, Class type,
      List<MyPartbean> records, String[] columns)
      throws IOException, CsvRequiredFieldEmptyException, CsvDataTypeMismatchException {

    FileWriter writer = new FileWriter(file_location);
    ColumnPositionMappingStrategy mappingStrategy = new 
    ColumnPositionMappingStrategy();
    mappingStrategy.setType(type);
    mappingStrategy.setColumnMapping(columns);
    debug("mapping: " +mappingStrategy.getColumnMapping().length);

    StatefulBeanToCsv<MyPartbean> beanToCsv =
        new StatefulBeanToCsvBuilder<MyPartbean>(writer)
            .withMappingStrategy(mappingStrategy)
            . withSeparator(',')
            .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
            .build();
    beanToCsv.write(records);

    for(int i=0; i<records.size(); i++){
      MyPartbean item = (MyPartbean) records.get(i);
      debug(i + " " + item.getNumber() + " :: " + item.getDescription());
    }
    writer.close();
  }
}

输出文件有两个“,”,由列数[] 表示。但是没有列和值

,,
,,

有什么建议吗?

【问题讨论】:

  • 由于多种原因,所提供的代码无法编译。
  • 注意:编译错误修复代码使用 OpenCSV 4.1 版生成预期结果(非空输出文件),如本教程中使用的那样(URL 请参见 OP)。

标签: java csv opencsv


【解决方案1】:

它适用于 OpenCSV 4.x 和 5.x (针对 4.1、5.6 和 5.7 进行了测试)像这样:

保持不变,就像在 OP 中一样。

注意:我对 writeToCSV 方法进行了一些概括,因此它接受您传递给该方法的任何 bean。

序列化并写入

public class CSVUtils {

  public static <T> void writeToCSV(String location, Class<T> type, List<T> records, String[] columns)
          throws IOException, CsvRequiredFieldEmptyException, CsvDataTypeMismatchException {

    ColumnPositionMappingStrategy<T> mappingStrategy = new ColumnPositionMappingStrategy<>();
    mappingStrategy.setType(type);
    mappingStrategy.setColumnMapping(columns);

    try (Writer writer = new FileWriter(file_location)) {
      StatefulBeanToCsv<T> beanToCsv = new StatefulBeanToCsvBuilder<T>(writer)
                  .withMappingStrategy(mappingStrategy)
                  .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
                  .build();
      beanToCsv.write(records);
    }
  }
}

赛跑者

public class OpenCSV56Demo {

  public static void main(String[] args){
    List<MyPartbean> mybeans = List.of(new MyPartbean("123", "Red"),
                                       new MyPartbean("456", "Blue"));

    String location = "myPartbeans.csv";
    String[] columns = new String[]{"number", "description"};
    try {
      CSVUtils.writeToCSV(location, MyPartbean.class, mybeans, columns);
    } catch (IOException | CsvRequiredFieldEmptyException | CsvDataTypeMismatchException e) {
      e.printStackTrace();
    }
  }

}

区别:

  • String[] columns = new String[]{"number", "description"}
  • 小写'n' 和 'd'!

对比

  • String[] columns = new String[]{"Number", "Description"};(OP)

看起来,OpenCSV 5.x 使用的映射不再容忍大写的列名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2020-04-07
    • 2017-01-18
    相关资源
    最近更新 更多