2

I am trying to write some data to csv. Here is what I am trying to do:

class Sample {

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

Implementation

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.



I couldn't find much on writing a list of instances to csv.

UPDATE:

I tried the below links and code as suggested by @Praveen, @dgg below in comments but I am getting empty csv file written.

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



Atihska
  • 4,803
  • 10
  • 56
  • 98
  • If you have a list of sample objects (`List`) then you can [write that list directly to a CSV file](http://opencsv.sourceforge.net/#writing_from_a_list_of_beans). It's all in the documentation. – andrewJames May 28 '21 at 16:01
  • Here's an introduction: https://www.baeldung.com/opencsv – dgg May 28 '21 at 16:05
  • @dgg I tried StatefulBeanToCsv but getting empty csv generated. – Atihska May 28 '21 at 17:14
  • Show us your revised code. You can [edit] the question. Also, tell us what version of OpenCSV you are using. – andrewJames May 28 '21 at 17:17
  • @andrewJames you can avoid generating an empty csv by adding @CsvBindByPosition(position = ) under each field. Also, getters and setters are must (can use lombok) – techmagister Oct 11 '22 at 09:12

2 Answers2

1

I actually found a better way of writing it using PrintWriter, where my bean gets directly added to csv by overriding toString() in java bean . Here is what I did:

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

Bean

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

Atihska
  • 4,803
  • 10
  • 56
  • 98
0

You can use StatefulBeanToCsv to map a list of object to a csv file

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);
}
Praveen
  • 8,945
  • 4
  • 31
  • 49