univocity 基于动态列映射将 csv 解析为相同的 pojo
univocity parse csv to same pojo based on dynamic column mappings
我正在使用带有 BeanListProcessor 的单一解析器来映射到我的 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 文件:
用户 1 列,user2Column\n
数据 1、数据 2
用户 1 映射
user1Column -> myColumn1
user2Column -> myColumn2
由于 header 名称不相关,您可以按位置映射您的属性:
public class MyPojo{
@Trim
@Parsed(index = 0)
private String myColumn1;
@Trim
@Parsed(index = 1)
private String myColumn2;
}
这样,无论您得到什么 header,属性都会相应地填充。使用 selectIndexes
更改从输入中提取的列的顺序,以便它们与 class.
中的位置相匹配
或者,如果 header 可以以任意随机顺序出现,您可以保留最初发布的代码并添加对 setHeaders
方法的调用:
如果您的输入是:
user1Column,user2Column\n data1,data2
然后使用:
parserSettings.setHeaders("myColumn1", "myColumn2");
如果您的输入是:
user2Column,user1Column\n data1,data2
然后选择:
parserSettings.setHeaders("myColumn2", "myColumn1");
请注意,此处的名称与您的 bean 中的属性相匹配。 header 仍从输入中提取,但将被忽略。
希望对您有所帮助
我正在使用带有 BeanListProcessor 的单一解析器来映射到我的 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 文件:
用户 1 列,user2Column\n
数据 1、数据 2
用户 1 映射
user1Column -> myColumn1
user2Column -> myColumn2
由于 header 名称不相关,您可以按位置映射您的属性:
public class MyPojo{
@Trim
@Parsed(index = 0)
private String myColumn1;
@Trim
@Parsed(index = 1)
private String myColumn2;
}
这样,无论您得到什么 header,属性都会相应地填充。使用 selectIndexes
更改从输入中提取的列的顺序,以便它们与 class.
或者,如果 header 可以以任意随机顺序出现,您可以保留最初发布的代码并添加对 setHeaders
方法的调用:
如果您的输入是:
user1Column,user2Column\n data1,data2
然后使用:
parserSettings.setHeaders("myColumn1", "myColumn2");
如果您的输入是:
user2Column,user1Column\n data1,data2
然后选择:
parserSettings.setHeaders("myColumn2", "myColumn1");
请注意,此处的名称与您的 bean 中的属性相匹配。 header 仍从输入中提取,但将被忽略。
希望对您有所帮助