Java ETL - 通过映射将CSV文件映射到POJO以进行Hibernate加载

时间:2015-10-27 13:38:25

标签: java csv mapping etl

我有几个不同的csv文件,其中包含我需要导入表格的数据。

两个csv文件都具有映射到同一对象的字段,但具有不同的列名和列的顺序。我希望找到一种简单的方法来进行这种映射,然后使用hibernate来处理对db的写入。

是否有标准/简便的方法来进行这些映射?

我想我可以创建一些哈希映射来跟踪列和值,这样列可以按任何顺序排列,但我很好奇是否有更简单(或更标准)的方式。我在谷歌里找不到任何东西。

1 个答案:

答案 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许可证)。