univocity根据动态列映射将csv解析为相同的pojo

时间:2018-06-05 16:36:35

标签: java csv univocity

我使用带有BeanListProcessor的univocity解析器映射到我的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 - &gt; myColumn1
user2Column - &gt; myColumn2

1 个答案:

答案 0 :(得分:0)

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

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中的属性匹配。标题仍然从输入中提取,但将被忽略。

希望这有帮助