Записать несколько классов в один файл CSV - PullRequest
1 голос
/ 18 мая 2019

У меня есть список объектов, которые являются экземплярами ряда подклассов базового класса. Я пытался записать эти объекты вместе в один файл CSV.

Каждый класс содержит поля базового класса и добавляет пару дополнительных полей.

То, чего я пытаюсь добиться, это выписать CSV, имеющий сначала поля базового класса, а затем столбцы, идущие от остальных подклассов. Это, конечно, означает, что подклассы, которые не содержат конкретного имени столбца, должны иметь это поле пустым.

Я пытался добиться этого с помощью OpenCSV и SuperCSV, но мне не удалось настроить их для этого. Глядя на код библиотек, я почти уверен, что OpenCSV не сделает этого. Используя SuperCSV с Dozer, я получил несколько классов для записи в один файл, но я не могу получить пустые столбцы там, где у класса отсутствует определенное поле столбца.

Очевидно, что я могу написать свой собственный модуль записи 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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...