首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >univocity基于动态列映射将csv解析为相同的pojo

univocity基于动态列映射将csv解析为相同的pojo
EN

Stack Overflow用户
提问于 2018-06-06 00:36:35
回答 1查看 754关注 0票数 1

我使用带有BeanListProcessor的univocity解析器来映射到我的Java Bean,这很好,前提是列名不变。但是,我还需要解析一个csv文件,该文件为每种类型的用户提供了不同的列。我为每个用户存储了到我的标准列名的映射,但是我如何在不修改文件的情况下将其动态解析到我的pojo。我不能使用HeaderTransformer,因为它仍然不是动态的。如果您需要更多信息,请告诉我。我使用的版本是2.6.3

例如:

代码语言:javascript
复制
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,user2列\n data1,data2

用户1映射

user1Column -> myColumn1

user2Column -> myColumn2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 08:58:56

由于头名称不相关,您可以按位置映射您的属性:

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

注意,这里的名称与bean中的属性相匹配。标头仍然从输入中提取,但将被忽略。

希望这能有所帮助

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

https://stackoverflow.com/questions/50705002

复制
相关文章

相似问题

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