有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用java中的opencsv CSVWriter在csv中写入对象列表

我正在尝试将一些数据写入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建议的以下链接和代码,但我得到的是空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();
        }
    }




共 (2) 个答案

  1. # 1 楼答案

    实际上,我找到了一种使用PrintWriter编写它的更好方法,在这种方法中,我的bean通过重写Javabean中的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(",");
            }
        }
    }
    
    
  2. # 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);
    }