сопоставление определенного столбца файла csv с конкретным полем POJO

Мне нужно сопоставить конкретный столбец CSV на основе индекса с определенными атрибутами POJO. Сопоставление будет основано на файле json, который будет содержать столбецIndex и имя атрибута, что означает, что для определенного столбцаIndex из CSV-файла вы должны сопоставить определенный атрибут из класса Pojo. Ниже приведен пример файла json, в котором показана стратегия сопоставления столбцов с атрибутами Pojo.

[{"индекс":0,"имя столбца":"дата"},{"индекс":1,"имя столбца":"адрес устройства"},{"индекс":7,"имя столбца":"iPAddress"},{ "индекс": 3, "имя столбца": "имя пользователя"}, {"индекс": 10, "имя столбца": "группа"}, {"индекс": 5, "имя столбца": "имяКатегории события"}, {"индекс ":6,"имя столбца":"сообщение"}]

Я пытался использовать библиотеку OpenCSV, но проблемы, с которыми я столкнулся, заключаются в том, что я не могу прочитать с ней неполный столбец. Как и в приведенном выше json, вы можете видеть, что мы пропускаем индексы 2 и 4 для чтения из файла CSV. Ниже приведен код с файлом openCSV.

public static List<BaseDataModel> readCSVFile(String filePath,List<String> columnListBasedOnIndex) {
        List<BaseDataModel> csvDataModels = null;
        File myFile = new File(filePath);
        try (FileInputStream fis = new FileInputStream(myFile)) {
            final ColumnPositionMappingStrategy<BaseDataModel> strategy = new ColumnPositionMappingStrategy<BaseDataModel>();
            strategy.setType(BaseDataModel.class);


            strategy.setColumnMapping(columnListBasedOnIndex.toArray(new String[0]));

            final CsvToBeanBuilder<BaseDataModel> beanBuilder = new CsvToBeanBuilder<>(new InputStreamReader(fis));
            beanBuilder.withMappingStrategy(strategy);

            csvDataModels = beanBuilder.build().parse();

        } catch (Exception e) {
            e.printStackTrace();
        }
}


List<ColumnIndexMapping> columnIndexMappingList = dataSourceModel.getColumnMappingStrategy();
                    List<String> columnNameList = columnIndexMappingList.stream().map(ColumnIndexMapping::getColumnname)
                            .collect(Collectors.toList());

List<BaseDataModel> DataModels = Utility
                                    .readCSVFile(file.getAbsolutePath() + File.separator + fileName, columnNameList);

Я также пробовал с однозначностью, но с помощью этой библиотеки я могу сопоставить csv с определенными атрибутами. Ниже приведен код -

CsvParserSettings settings = new CsvParserSettings();
        settings.detectFormatAutomatically(); //detects the format 
        settings.getFormat().setLineSeparator("\n");
        //extracts the headers from the input
        settings.setHeaderExtractionEnabled(true);
        settings.selectIndexes(0, 2); //rows will contain only values of columns at position 0 and 2
        CsvRoutines routines = new CsvRoutines(settings); // Can also use TSV and Fixed-width routines
        routines.parseAll(BaseDataModel.class, new File("/path/to/your.csv"));


        List<String[]> rows = new CsvParser(settings).parseAll(new File("/path/to/your.csv"), "UTF-8");

Пожалуйста, посмотрите, может ли кто-нибудь помочь мне в этом случае.


person nitin tyagi    schedule 09.05.2019    source источник


Ответы (1)


Автор univocity-парсеров здесь. Вы можете определить сопоставления с атрибутами вашего класса в коде вместо аннотаций. Что-то вроде этого:

public class BaseDataModel {
    private String a;
    private int b;
    private String c;
    private Date d;
}

Затем в своем коде сопоставьте атрибуты с любыми именами столбцов, которые вам нужны:

ColumnMapper mapper = routines.getColumnMapper();
mapper.attributeToColumnName("a", "col1");
mapper.attributeToColumnName("b", "col2");
mapper.attributeToColumnName("c", "col3");
mapper.attributeToColumnName("d", "col4");

Вы также можете использовать mapper.attributeToIndex("d", 3); для сопоставления атрибутов с заданным индексом столбца.

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

person Jeronimo Backes    schedule 09.05.2019
comment
Я обрабатываю файл размером 1,5 ГБ с помощью вашей библиотеки и получаю сообщение об ошибке «Недостаточно памяти». есть ли способ прочитать файл в куске? - person nitin tyagi; 24.07.2019
comment
CsvRoutines.iterate(Class) должен решить вашу проблему. Не загружайте все в список - person Jeronimo Backes; 26.07.2019
comment
Мне нужно преобразовать выбранный столбец CSV в Json. есть ли способ сделать это с помощью итератора в Univocity? - person nitin tyagi; 21.08.2019