将多个类写入一个CSV文件

时间:2019-05-18 15:35:36

标签: java csv opencsv supercsv

我有一个对象列表,这些对象是基类的许多子类的实例。我一直试图将这些对象一起写到一个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();
        }
    }
}

0 个答案:

没有答案
相关问题