首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将csv文件的特定列映射到特定的POJO字段

将csv文件的特定列映射到特定的POJO字段
EN

Stack Overflow用户
提问于 2019-05-09 20:57:23
回答 1查看 1.1K关注 0票数 2

我必须根据索引将特定的CSV列映射到特定的POJO属性。映射将基于包含columnIndex和属性名称的json文件,这意味着对于来自csv文件的特定columnIndex,您必须映射来自Pojo类的特定属性。下面是一个json文件示例,它显示了带有Pojo属性的列映射策略。

{“索引”:0,“列名”:“日期”},{“索引”:1,“列名”:“deviceAddress”},{“索引”:7,“列名”:“iPAddress”},{“索引”:3,“列名”:“userName”},{“索引”:10,“列名”:“组”},{“索引”:5,“列名”:“eventCategoryName”},{“索引”:6,“列名”:“消息”}

我尝试过使用OpenCSV库,但我面临的挑战是我无法用它阅读部分列。和上面的json一样,你可以看到我们跳过了索引2和4来读取CSV文件。下面是openCSV文件的代码。

代码语言:javascript
复制
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映射到特定的属性。下面是代码-

代码语言:javascript
复制
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");

在这种情况下,请看一下有没有人能帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-10 03:23:11

univocity解析器的作者在这里。您可以在代码中定义到类属性的映射,而不是注释。如下所示:

代码语言:javascript
复制
public class BaseDataModel {
    private String a;
    private int b;
    private String c;
    private Date d;
}

然后,在您的代码中,将属性映射到所需的任何列名:

代码语言:javascript
复制
ColumnMapper mapper = routines.getColumnMapper();
mapper.attributeToColumnName("a", "col1");
mapper.attributeToColumnName("b", "col2");
mapper.attributeToColumnName("c", "col3");
mapper.attributeToColumnName("d", "col4");

您还可以使用mapper.attributeToIndex("d", 3);将属性映射到给定列索引。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56059978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档