【问题标题】:How to write list of objects in a csv using opencsv CSVWriter in java如何在java中使用opencsv CSVWriter在csv中写入对象列表
【发布时间】:2021-05-28 15:48:33
【问题描述】:

我正在尝试将一些数据写入 csv。这是我想要做的:

class Sample {

  private String id;
  private String type;
  private String name;
  private int value;
  
  // getter-setter
}

实施

import com.opencsv.CSVWriter;

...

// code snippet

List<String> ids = getIds();
List<Sample> result = new ArrayList<>();
for (String id : ids) {
  Sample sample = getSample(id);
  
  result.add(sample);

}

//write result to csv
CSVWriter csvWriter = new CSVWriter(new FileWriter(filePath), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);

// Not sure what to do next here.



我找不到太多关于将实例列表写入 csv 的内容。

更新:

我按照@Praveen 的建议尝试了下面的链接和代码,@dgg 在 cmets 中,但我得到的是空的 csv 文件。

public void writeToCsv(String filePath, String[] header, List<Sample> samples) throws IOException {

        try (FileWriter writer = new FileWriter(filePath)) {
            ColumnPositionMappingStrategy mappingStrategy = new ColumnPositionMappingStrategy();
            mappingStrategy.setType(Sample.class);
            mappingStrategy.setColumnMapping(header);

            StatefulBeanToCsv<Sample> beanToCsv = new StatefulBeanToCsvBuilder<Sample>(writer)
                    .withMappingStrategy(mappingStrategy)
                    .withSeparator('#')
                    .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
                    .build();

            // todo: getting empty csv file. why? currently debugging.
            beanToCsv.write(samples);

        } catch (CsvRequiredFieldEmptyException e) {
            e.printStackTrace();
        } catch (CsvDataTypeMismatchException e) {
            e.printStackTrace();
        }
    }



【问题讨论】:

  • 如果您有示例对象列表 (List&lt;Sample&gt;),那么您可以write that list directly to a CSV file。这一切都在文档中。
  • 这里是介绍:baeldung.com/opencsv
  • @dgg 我尝试了 StatefulBeanToCsv,但生成了空的 csv。
  • 向我们展示您修改后的代码。你可以edit这个问题。另外,请告诉我们您使用的 OpenCSV 版本。

标签: java csv instance opencsv


【解决方案1】:

我实际上找到了使用PrintWriter 编写它的更好方法,其中我的bean 通过覆盖java bean 中的toString() 直接添加到csv。这是我所做的:

 public void writeToCsv(List<Sample> sampleList, String header) throws IOException {
        PrintWriter writer = new PrintWriter("filepath/demo/sample.csv");
        writer.println(header);

        for (Sample sample : sampleList) {
            writer.println(sample.toString());
        }
        writer.close();
    }

豆子

class Sample {

  private String id;
  private String type;
  private String name;
  private int value;
  
  // getter-setter

  @Override
  public String toString(){
        StringBuilder dataBuilder = new StringBuilder();
        appendFieldValue(dataBuilder, id);
        appendFieldValue(dataBuilder, type);
        appendFieldValue(dataBuilder, name);
        appendFieldValue(dataBuilder, value);
        

        return dataBuilder.toString();
    }

    private void appendFieldValue(StringBuilder dataBuilder, String fieldValue) {
        if(fieldValue != null) {
            dataBuilder.append(fieldValue).append(",");
        } else {
            dataBuilder.append("").append(",");
        }
    }
}

【讨论】:

  • 这很好,不依赖任何东西。
  • 我认为这不会用逗号转义任何字符串。在其中添加 StringEscapeUtils .escapeCsv(fieldValue)
【解决方案2】:

您可以使用StatefulBeanToCsv 将对象列表映射到 csv 文件

try (FileWriter writer = new FileWriter("path/to/file.csv")) {
    ColumnPositionMappingStrategy mappingStrategy =  new ColumnPositionMappingStrategy();
    mappingStrategy.setType(Sample.class);

    String[] columns = { "Id", "Type", "Name", "Value" };
    mappingStrategy.setColumnMapping(columns);
    
    StatefulBeanToCsv beanWriter = new StatefulBeanToCsvBuilder(writer)
        .withMappingStrategy(mappingStrategy)
        .build();

    beanWriter.write(sampleList);
}

【讨论】:

  • 我尝试了 StatefulBeanToCsv,但生成了空的 csv。
  • BeanToCsv 不久前已从 OpenCSV 中删除 - 并被 StatefulBeanToCsv 取代。确保您使用的是最新版本的 OpenCSV。
猜你喜欢
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
相关资源
最近更新 更多