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