解析整个csv文件与在java

时间:2018-04-20 16:46:44

标签: java csv parsing javabeans

我有一个更大的csv文件大约80K到120K行(取决于当天)。我成功运行了使用@CsvBindByName注释将整个csv文件解析为java对象的代码。示例代码:

Reader reader = Files.newBufferedReader(Paths.get(file));
    CsvToBean csvToBean = new CsvToBeanBuilder<Object>(reader)
            .withType(MyCustomClass.class)
            .withIgnoreLeadingWhiteSpace(true)
            .build(); 
    List<MyCustomClass> myCustomClass= csvToBean.parse();`

我想更改此代码以逐行解析csv文件而不是整个文件,但保留了映射到java bean对象的整洁性。基本上是这样的:

    CSVReader csvReader = new CSVReader(Files.newBufferedReader(Paths.get(csvFileLoc)));
    String[] headerRow = csvReader.readNext(); // save the headerRow
    String [] nextLine = null;
    MyCustomClass myCustomClass = new MyCustomClass(); 
    while ((nextLine = csvReader.readNext())!=null) {
                    myCustomClass.setField1(nextLine[0]);
                    myCustomClass.setField2(nextLine[1]);
                    //.... so on 
                }

但上述解决方案让我知道每个字段的列位置。我想要的是根据标题行映射我从csv获得的字符串数组,类似于opencsv在解析整个csv文件时所做的事情。但是,就我所知,我无法使用opencsv做到这一点。我曾认为这是一种非常常见的做法,但我无法在网上找到任何引用。可能是因为我不能正确理解opencsv库的CsvToBean用法。我可以使用csvToBean.iterator迭代bean,但我认为整个csv文件使用build方法加载到内存中,这种方法无法逐行读取。欢迎任何建议

1 个答案:

答案 0 :(得分:3)

进一步查看API docs,我看到CsvToBean<T>实现了Iterable<T>并且有iterator()方法返回Iterator<T>,其记录如下:

  

此方法返回的迭代器一次接受一行输入并一次返回一个bean。

所以看起来你可以把你的循环写成:

for (MyCustomClass myCustomClass : csvToBean) {
    // . . . do something with the bean . . .
}

为了澄清一些可能的混淆,您可以在源代码中看到CsvToBeanBuilder CsvToBean方法只创建CsvToBean对象,而不是实际输入,build()方法和java.util.Calendar对象的parse()分别执行输入。