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");
Обратите внимание, что здесь имена совпадают с атрибутами вашего компонента. Заголовки по-прежнему извлекаются из ввода, но будут игнорироваться.
Надеюсь это поможет