繁体   English   中英

如何处理大的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"))返回的实例csv.parse(strat, getReader("file.txt"))实现Iterable接口,该接口包含一个iterator()返回Iterator方法),因此这两个代码段之间没有性能差异。

PS

在第二个片段中,不要使用原始的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文件的最佳方法。 您可以有多个线程来读取文件中的数据,而有几个其他线程来执行业务逻辑。 更多详细信息,请参见此处读取块中的CSV数据。 如何逐块分析大CSV文件并批量插入数据库,在此处具有多个解决方案

“迭代器和列表有什么区别?”

列表是一种数据结构,可提供诸如get(),toArray()等用户功能。

迭代器仅允许用户浏览数据结构,前提是该数据结构实现了Iterator接口(所有数据结构都可以这样做)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM