我有一个对象列表,这些对象是基类的许多子类的实例。我一直试图将这些对象一起写到一个CSV文件中。
每个类都包含基类的字段,并添加了几个自己的额外字段。
我要实现的目的是首先写出一个具有基类字段的csv,然后再列出来自其余子类的列。当然,这意味着不包含特定列名的子类应将该字段留空。
我尝试使用OpenCSV和SuperCSV实现此目的,但没有设法将它们配置为执行此操作。查看库代码,我很确定OpenCSV不会这样做。在Dozer中使用SuperCSV,我可以在一个文件中写入多个类,但是当类缺少特定的列字段时,我无法获得空列。
我显然可以编写自己的自定义CSV编写器来实现此目的,但是我想知道是否有人可以基于现有CSV编写器库帮助我找到解决方案。
编辑:根据评论者的请求,在下面添加了SuperCSV代码
private static final String[] FIELD_MAPPING = new String[] { "documentNumber", "lineOfBusiness", "clientId", "childClass1Field", };
private static final String[] FIELD_MAPPING2 = new String[] { "documentNumber", "lineOfBusiness", "clientId", "childClass2Field1", "childClass2Field2"};
public static void writeWithCsvBeanWriter(PrintWriter writer, List<ParentClass> documents) throws Exception {
CsvDozerBeanWriter beanWriter = null;
try {
beanWriter = new CsvDozerBeanWriter(writer, CsvPreference.STANDARD_PREFERENCE);
final String[] header = new String[] { "documentNumber", "lineOfBusiness", "clientId", "childClass1Field", "childClass2Field1", "childClass2Field2"};
beanWriter.configureBeanMapping(ChildClass1.class, FIELD_MAPPING);
beanWriter.configureBeanMapping(ChildClass2.class, FIELD_MAPPING2);
final CellProcessor[] processors = new CellProcessor[] { new Optional(), new Optional(), new Optional(), new Optional() }
final CellProcessor[] processors2 = new CellProcessor[] { new Optional(), new Optional(), new Optional(), new Optional(), new Optional() }
beanWriter.writeHeader(header);
for (final ParentClass document : documents) {
if (document instanceof ChildClass1) {
beanWriter.write(document, processors);
} else {
beanWriter.write(document, processors2);
}
}
} finally {
if (beanWriter != null) {
beanWriter.close();
}
}
}