我有一个更大的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
方法加载到内存中,这种方法无法逐行读取。欢迎任何建议
答案 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()
分别执行输入。