Univocity 根据动态列映射将 CSV 解析为同一 POJO



我正在使用带有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文件:用户
1 列,用户 2 列 数据1,数据2

用户 1映射
用户 1 列 -> myColumn1
用户 2 列 -> myColumn2

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

public class MyPojo{
@Trim
@Parsed(index = 0)
private String myColumn1;
@Trim
@Parsed(index = 1)
private String myColumn2;
}

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

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

如果您的输入是:

user1Column,user2Columnn data1,data2

然后使用:

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

如果您的输入是:

user2Column,user1Columnn data1,data2

然后选择:

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

请注意,此处的名称与 Bean 中的属性匹配。标头仍从输入中提取,但将被忽略。

希望这有帮助

最新更新