2012-07-03 3 views
0

У меня очень большой файл csv, и я должен использовать некоторый запрос select, получая avg, ... Я не могу нормально это делать, читая строки за строкой из-за нехватки памяти.Как работать с большим файлом 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

Я не понимаю, почему приведенный выше код приведет к OutOfMemoryError:. Он имеет только одну строку в памяти в то время –

+0

нагрузки ли сканер. весь файл в память сначала? http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html –

ответ

0

Я предлагаю использовать Apache Commons FileUtil для этого прецедента. Возможно, это не то, что вы ищете в своем вопросе, но использование FileUtil предпочтительнее повторной реализации.

В частности, пожалуйста, посмотрите на метод lineIterator.

2

Вы не вызывали useDelimiter, поэтому методы next() должны загружать весь файл в строку, если он не имеет пробела (разделитель по умолчанию).

Это приводит к ошибке OutOfMemory.

Если вы хотите использовать сканер, установите разделитель в соответствии с вашими потребностями.

Но библиотека CSV (как csvfile, вероятно, будет более эффективным

Смежные вопросы