如何处理大型csv文件或以块为单位读取大型CSV文件

时间:2015-07-21 05:48:23

标签: java opencsv

我有非常大的csv文件,我试图迭代。我正在使用opencsv,我想使用CsvToBean,以便我可以动态设置数据库中的列映射。我的问题是如何在不抓取整个文件并将其放入列表的情况下执行此操作。我试图防止内存错误。

我目前正在将整个结果集传递到这样的列表中。

List<MyOption> myObjects = csv.parse(strat, getReader("file.txt"));

for (MyObject myObject : myObjects) {
    System.out.println(myObject);
}

但是我找到了这个迭代器方法,我想知道这是否只会迭代每一行而不是整个文件?

Iterator myObjects = csv.parse(strat, getReader("file.txt")).iterator();

while (myObjects.hasNext()) {
    MyObject myObject = (MyObject) myObjects.next();
    System.out.println(myObject);
}

所以我的问题是Iterator和list之间的区别是什么?

3 个答案:

答案 0 :(得分:1)

增强的for循环(for (MyObject myObject : myObjects))是使用Iterator实现的(它要求csv.parse(strat, getReader("file.txt"))返回的实例实现Iterable接口,其中包含iterator() 1}}返回Iterator)的方法,因此两个代码段之间没有性能差异。

P.S

在第二个代码段中,请勿使用原始Iterator类型,使用Iterator<MyObject>

Iterator<MyObject> myObjects = csv.parse(strat, getReader("file.txt")).iterator();

while (myObjects.hasNext()) {
    MyObject myObject = myObjects.next();
    System.out.println(myObject);
}

答案 1 :(得分:1)

一次读取大型csv文件不是一个好的解决方案。以块的形式读取csv文件的最佳方法。您可以使用多个线程来读取文件中的数据,并使用其他几个线程来执行业务逻辑。有关以块为单位读取CSV数据的更多详细信息,请How to parse chunk by chunk a large CSV file and bulk insert to a database,并且有多个解决方案here

答案 2 :(得分:1)

“Iterator和list之间有什么区别?”

List是一种数据结构,为用户提供get(),toArray()等功能。

迭代器只允许用户在数据结构中导航,前提是数据结构实现了Iterator接口(所有数据结构都是这样)

所以List<MyOption> myObjects = csv.parse(strat, getReader("file.txt"));将数据物理存储在myObjects

Iterator myObjects = csv.parse(strat, getReader("file.txt")).iterator();只使用csv.parse的迭代器功能