我有几个不同的csv文件,其中包含我需要导入表格的数据。
两个csv文件都具有映射到同一对象的字段,但具有不同的列名和列的顺序。我希望找到一种简单的方法来进行这种映射,然后使用hibernate来处理对db的写入。
是否有标准/简便的方法来进行这些映射?
我想我可以创建一些哈希映射来跟踪列和值,这样列可以按任何顺序排列,但我很好奇是否有更简单(或更标准)的方式。我在谷歌里找不到任何东西。
答案 0 :(得分:0)
获取univocty-parsers并使用@Parsed
注释注释您的pojo,并指定列名称。
public class MyPojo {
@Trim
@LowerCase
@Parsed // column name will be derived from input CSV
private String text;
@Parsed(field = "purchase amount") //here you define the column name explictly
private BigDecimal amount;
public BigDecimal getAmount(){
return amount;
}
}
然后,扩展此类并使用注释提供另一个字段名称:
public class AnotherPojo extends MyPojo {
@Parsed(field = "some amount")
private BigDecimal amount;
@Override
public BigDecimal getAmount(){
return amount;
}
}
使用BeanListProcessor<MyPojo>
类型的行处理器然后BeanListProcessor<AnotherPojo>
解析文件(查看教程)。代码看起来应该是这样的(我没有对此进行测试,但你应该得到这个想法):
public <T> List<T> parseBeans(Class<T> beanType, File inputFile){
BeanListProcessor<T> rowProcessor = new BeanListProcessor<T>(beanType);
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.setRowProcessor(rowProcessor);
parserSettings.setHeaderExtractionEnabled(true); //will get headers from the input file
CsvParser parser = new CsvParser(parserSettings);
//this will read your file and submit all rows to the row processor defined above
parser.parse(new FileReader(inputFile));
List<T> beans = rowProcessor.getBeans();
return beans;
}
由于所有对象都位于MyPojo
的层次结构中,因此您可以轻松地保留从每个文件中提取的数据。
披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。