gpt4 book ai didi

java - 使用superCSV读取一个80GB的大文本文件

转载 作者:搜寻专家 更新时间:2023-11-01 03:10:09 24 4
gpt4 key购买 nike

我想读取一个巨大的 csv 文件。我们一般使用 superCSV 来解析文件。在这种特殊情况下,文件很大,并且由于显而易见的原因总是会出现内存不足的问题。

最初的想法是将文件作为 block 读取,但我不确定这是否适用于 superCSV,因为当我将文件分块时,只有第一个 block 具有 header 值并将加载到 CSV bean 中,而其他 block 没有 header 值,我觉得它可能会抛出异常。所以

a) 我想知道我的思维过程是否正确
b) 有没有其他方法可以解决这个问题。

所以我的主要问题是

superCSV 是否具有处理大型 csv 文件的能力,我看到 superCSV 通过 BufferedReader 读取文档。但是我不知道缓冲区的大小是多少,我们可以根据需要更改它吗?

@Gilbert Le Blanc我已经尝试按照您的建议拆分成更小的 block ,但是将大文件拆分成更小的 block 需要很长时间。这是我为此编写的代码。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;

public class TestFileSplit {

public static void main(String[] args) {

LineNumberReader lnr = null;
try {
//RandomAccessFile input = new RandomAccessFile("", "r");
File file = new File("C:\\Blah\\largetextfile.txt");
lnr = new LineNumberReader(new FileReader(file), 1024);
String line = "";
String header = null;
int noOfLines = 100000;
int i = 1;
boolean chunkedFiles = new File("C:\\Blah\\chunks").mkdir();
if(chunkedFiles){
while((line = lnr.readLine()) != null) {
if(lnr.getLineNumber() == 1) {
header = line;
continue;
}
else {
// a new chunk file is created for every 100000 records
if((lnr.getLineNumber()%noOfLines)==0){
i = i+1;
}

File chunkedFile = new File("C:\\Blah\\chunks\\" + file.getName().substring(0,file.getName().indexOf(".")) + "_" + i + ".txt");

// if the file does not exist create it and add the header as the first row
if (!chunkedFile.exists()) {
file.createNewFile();
FileWriter fw = new FileWriter(chunkedFile.getAbsoluteFile(), true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(header);
bw.newLine();
bw.close();
fw.close();
}

FileWriter fw = new FileWriter(chunkedFile.getAbsoluteFile(), true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(line);
bw.newLine();
bw.close();
fw.close();
}
}
}
lnr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}

最佳答案

您可以在解析器 java 类本身中定义 header 。这样,您就不需要 CSV 文件中的标题行。

// only map the first 3 columns - setting header elements to null means those columns are ignored
final String[] header = new String[] { "customerNo", "firstName", "lastName", null, null, null, null, null, null, null };
beanReader.read(CustomerBean.class, header)

您还可以使用 SuperCSV api 的 dozer 扩展。

关于java - 使用superCSV读取一个80GB的大文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12645967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com