簡體   English   中英

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

[英]CSV Java file reading and saving (in different ArrayList)

好的隊友,這是我的代碼。 我遇到了一個問題,因為“ records.csv”是一個包含多達2000萬行的文件,每個行由4個字段組成,並以','分隔。

正如您從代碼中可以理解的那樣,我想擁有4個Arraylist,每個數組具有不同字段的所有值。 一段時間后該方法停止工作(我認為是因為要將元素“添加”到列表中,所以Java具有一個指針,該指針必須先執行所有arraylist)。

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

有什么建議嗎?

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字節。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.nio.CharBuffer.wrap(Unknown Source) at sun.nio.cs.StreamEncoder.implWrite(Unknown Source) at sun.nio.cs.StreamEncoder.write(Unknown Source) at java.io.OutputStreamWriter.write(Unknown Source) at java.io.BufferedWriter.flushBuffer(Unknown Source) at java.io.PrintStream.write(Unknown Source) at java.io.PrintStream.print(Unknown Source) at RecordReader.Reader(RecordReader.java:42) at prova.main(prova.java:26)

我有兩個建議給您。

首先,您不需要有4個單獨的ArrayLists ,只需一個就可以了。 而不是使用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個額外的ArrayLists的額外開銷。

其次,由於您的字段由分隔,並且(我假設)字段的數量始終相同,因此您可以使用split()方法將每一行分成字符串數組。

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

將以上內容放入循環中,即可遍歷文件的所有內容。 由於您知道信息的排序方式,因此檢索所需信息非常簡單。

但是,我警告您,如果文件足夠大(具有多個GB的數據),此方法最終也會失敗。

您是否可以嘗試使用-Xmx選項運行應用程序,如下所示

java -Xmx6g [javaclassfile]

我能夠解決類似的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM