gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:24:25 39 4
gpt4 key购买 nike

我使用带有 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;

...

用户1文件:
user1 列,user2 列\n数据1,数据2

用户 1 映射
user1Column -> myColumn1
user2Column -> myColumn2

最佳答案

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

public class MyPojo{

@Trim
@Parsed(index = 0)
private String myColumn1;

@Trim
@Parsed(index = 1)
private String myColumn2;
}

这样,无论您获得什么 header ,属性都会相应地填充。使用 selectIndexes 更改从输入中提取的列的顺序,以便它们与类中的位置匹配。

或者,如果 header 可以以任意随机顺序出现,您可以保留最初发布的代码并添加对 setHeaders 方法的调用:

如果您的输入是:

user1Column,user2Column\n data1,data2

然后使用:

parserSettings.setHeaders("myColumn1", "myColumn2");

如果您的输入是:

user2Column,user1Column\n data1,data2

然后:

parserSettings.setHeaders("myColumn2", "myColumn1");

请注意,此处的名称与您的 bean 中的属性相匹配。 header 仍从输入中提取,但将被忽略。

希望这有帮助

关于java - univocity 基于动态列映射将 csv 解析为相同的 pojo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705002/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com