如何使用大型csv文件

时间:2012-07-03 19:24:42

标签: java csv

我有一个非常庞大的csv文件,我必须使用一些选择查询,得到平均值,...由于内存不足,我不能通过逐行读取来做到这一点。

以下代码适用于短csv文件但不适用于较大的csv文件。 如果您可以编辑此代码以用于大型csv文件,我将不胜感激。

import java.io.File;

import java.io.FileNotFoundException;
import java.util.Scanner;


public class Mu {
    public void Computemu()
    {
        String filename="testdata.csv";
        File file=new File(filename);
        try {
            Scanner inputstream=new Scanner(file);//Scanner read only string 
            // String data=inputstream.next();//Ignore the first line(header)
            double sum=0;
            double numberOfRating=0;

            while (inputstream.hasNext())
            {                       
               String data=inputstream.next();//get a whole line
                String[] values= data.split(";");//values separate by;
                double rating=Double.parseDouble(values[2].replaceAll("\"", ""));//change value to string
                if(rating>0)//do not consider implicit ratings
                {
                    sum+=rating;
                    numberOfRating++;
                }
            }
            inputstream.close();
            System.out.println("Mu is"+ (sum/numberOfRating));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您没有调用useDelimiter所以next()方法必须将整个文件加载到字符串中,如果它没有空格(默认分隔符)。

这会导致OutOfMemory错误。

如果您想使用扫描仪,请根据需要设置分隔符。

但是CSV库(如csvfile)可能效率更高。

答案 1 :(得分:0)

我建议在这个用例中使用Apache Commons FileUtil。这可能不是您在问题中寻找的内容,但FileUtil的使用比重新实现它更可取。

具体来说,请看lineIterator方法。