Univocity Parse CSV для того же Pojo на основе динамических сопоставлений столбцов

Я использую анализаторы однозначности с BeanListProcessor для отображения на мой Java Bean, что хорошо, если имена столбцов не меняются. Тем не менее, мне также нужно проанализировать CSV-файл, который поставляется с различными столбцами для каждого типа пользователей. У меня для каждого пользователя хранятся сопоставления со стандартными именами столбцов, но как мне динамически анализировать их в моем pojo без необходимости изменять файл. Я не мог использовать HeaderTransformer, так как он все еще не динамический. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Я использую версию 2.6.3

Например:

BeanListProcessor<MyPojo> rowProcessor = new BeanListProcessor<MyPojo>(MyPojo.class);

        CsvParserSettings parserSettings = new CsvParserSettings();
        parserSettings.setProcessor(rowProcessor);
        parserSettings.setHeaderExtractionEnabled(true);

        CsvParser parser = new CsvParser(parserSettings);
        parser.parse(getReader(file));

        List<MyPojo> pojos= rowProcessor.getBeans();
        pojos.forEach(v -> System.out.println(v.toString()));

public class MyPojo{

    @Trim
    @Parsed
    private String myColumn1;

    @Trim
    @Parsed
    private String myColumn2;

....

Файл User1:
user1Column, user2Column \ n data1, data2

Пользователь 1 отображений
user1Column -> myColumn1
user2Column -> myColumn2

1 ответ

Решение

Так как имена заголовков не релевантны, вы можете отобразить ваши атрибуты по позиции:

public class MyPojo{

    @Trim
    @Parsed(index = 0)
    private String myColumn1;

    @Trim
    @Parsed(index = 1)
    private String myColumn2;
}

Таким образом, независимо от того, какие заголовки вы получите, атрибуты будут заполнены соответственно. использование selectIndexes изменить порядок столбцов, извлеченных из входных данных, чтобы они соответствовали позициям в вашем классе.

В качестве альтернативы, если заголовки могут появляться в произвольной последовательности, вы можете сохранить код, который вы первоначально разместили, и добавить вызов к setHeaders метод:

Если вы вводите:

user1Column,user2Column\n data1,data2

Тогда используйте:

parserSettings.setHeaders("myColumn1", "myColumn2");

Если вы вводите:

user2Column,user1Column\n data1,data2

Затем перейдите с:

parserSettings.setHeaders("myColumn2", "myColumn1");

Обратите внимание, что здесь имена совпадают с атрибутами вашего компонента. Заголовки по-прежнему извлекаются из ввода, но будут игнорироваться.

Надеюсь это поможет

Другие вопросы по тегам