Univocity Parse CSV для того же Pojo на основе динамических сопоставлений столбцов - PullRequest
0 голосов
/ 05 июня 2018

Я использую анализаторы однозначности с 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 Ответ

0 голосов
/ 06 июня 2018

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

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");

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

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

...