我有一个非常庞大的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();
}
}
}
答案 0 :(得分:2)
您没有调用useDelimiter所以next()
方法必须将整个文件加载到字符串中,如果它没有空格(默认分隔符)。
这会导致OutOfMemory错误。
如果您想使用扫描仪,请根据需要设置分隔符。
但是CSV库(如csvfile)可能效率更高。
答案 1 :(得分:0)
我建议在这个用例中使用Apache Commons FileUtil。这可能不是您在问题中寻找的内容,但FileUtil的使用比重新实现它更可取。
具体来说,请看lineIterator方法。