如何处理处理大型 csv 文件或分块读取大型 CSV 文件

How to handle processing large csv file or read large CSV file in chunks

我正在尝试遍历非常大的 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 有什么区别?

增强的for循环(for (MyObject myObject : myObjects))使用Iterator实现(它要求csv.parse(strat, getReader("file.txt"))返回的实例实现Iterable接口,其中包含一个iterator() 方法 returns 和 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);
}

一次读取一个大的 csv 文件不是一个好的解决方案。分块读取 csv 文件的最佳方式。您可以有多个线程,一个线程从文件中读取数据,其他几个线程执行业务逻辑。在此处 How to parse chunk by chunk a large CSV file and bulk insert to a database and have multiple threds solution here

获取更多有关分块读取 CSV 数据的详细信息

"what is the difference between Iterator and list?"

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

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

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

Iterator myObjects = csv.parse(strat, getReader("file.txt")).iterator();只是使用了csv.parse

的迭代器功能