gpt4 book ai didi

java - CSV Java文件读取和保存(在不同的ArrayList中)

转载 作者:行者123 更新时间:2023-12-01 10:01:40 25 4
gpt4 key购买 nike

好的,伙计们,这是我的代码。我遇到了一个问题,因为“records.csv”是一个包含不到 2000 万行的文件,每个行由 4 个字段组成,并用“,”分隔。

正如您从代码中可以理解的那样,我想要 4 个 Arraylist,每个数组都包含不同字段的所有值。一段时间后该方法停止工作(我认为因为要将一个元素“添加”到列表中,java有一个必须在之前遍历所有数组列表的指针)。

我需要解决,但我不知道如何解决。

建议?

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class RecordReader {
static ArrayList<String> id = new ArrayList <String> ();
static ArrayList<String> field1 = new ArrayList <String> ();
static ArrayList<String> field2 = new ArrayList <String> ();
static ArrayList<String> field3 = new ArrayList <String> ();



public static void Reader () {
try {
FileReader filein = new FileReader("Y:/datasets/records.csv");
String token="";
String flag = "id";
int index=0, next;

do {
next = filein.read();

if (next != -1) {

if (next !=',' && next !='\n')
token = token + next;

else if (next == ','){
if (flag.compareTo("id")==0) {id.add (index, token); flag = "field1";}
else if (flag.compareTo("field1")==0) {field1.add (index, token); token=""; flag = "field2";}
else if (flag.compareTo("field2")==0) {field2.add (index, token); token=""; flag = "field3";}
}

else if (next == '\n') {
if (flag.compareTo("field3")==0) {field3.add (index, token); token=""; flag = "id"; index++;}
}

char nextc = (char) next;
System.out.print(nextc);
}
} while (next!=-1);

filein.close();
}
catch (IOException e) { System.out.println ("ERRORE, birichino!"); }
}
}

我必须一次性完成所有操作,该文件有 711000 字节。

线程“main”中出现异常 java.lang.OutOfMemoryError:Java 堆空间
在 java.nio.CharBuffer.wrap(来源未知)
在 sun.nio.cs.StreamEncoder.implWrite(来源未知)
在 sun.nio.cs.StreamEncoder.write(来源未知)
在 java.io.OutputStreamWriter.write(来源未知)
在 java.io.BufferedWriter.flushBuffer(来源未知)
在 java.io.PrintStream.write(来源未知)
在 java.io.PrintStream.print(来源未知)
在 RecordReader.Reader(RecordReader.java:42)
在 prova.main(prova.java:26)

最佳答案

我有一些建议给你。

首先,您不需要有 4 个单独的 ArrayList,只需一个就可以了。我不会使用 filein.read(),而是用 BufferedReader 包装您的 FileReader 并使用它逐行读取文件并添加每行到一个ArrayList

BufferedReader br = new BufferedReader(filein);
ArrayList<String> content = new ArrayList<String>();
String line = br.readLine();
while(line != null){
//add lines to ArrayList
content.add(line);
line = br.readLine();
}

这会将整个文件的内容读入内存,而不会产生 3 个额外 ArrayList 的额外开销。

其次,由于您的字段由 , 分隔,并且(我假设)始终具有相同数量的字段,因此您可以使用 split()方法将每一行分成一个字符串数组。

String[] record = content.get(index).split(",");
//record[0] = id
//record[1] = field1
//record[2] = field2
//record[3] = field3

将以上内容放入循环中,您可以迭代文件的所有内容。由于您知道信息的排序方式,因此检索所需的信息很简单。

但是,我会警告您,如果文件足够大(包含多个 GB 的数据),最终这种方法也会失败。

关于java - CSV Java文件读取和保存(在不同的ArrayList中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36774344/

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