2013-02-20 12 views
5

Mam aplikację w Javie, że używam openCSV do odczytu pliku (bardzo duży). Następnie umieszczam czwartą kolumnę (W końcu to będzie mieć kolejną kolumnę lub dwie, jeśli to robi różnicę) w HashSet i wysyłam do nowego pliku. Wszystko wydaje się działać dobrze, ale odkryłem, że jest to tylko część pliku (131,544 linii z 272,948). Czy jest to ograniczenie openCSV lub Javy w ogóle, czy jest jakiś sposób na obejście tego?openCSV nie czyta całego pliku

Mój kod dla odniesienia:

public static void main(String[] args) throws IOException { 
    String itemsFile = new String();   
    String outFile = new String(); 
    itemsFile = "items.txt";   
    outFile = "so.txt"; 
    CSVReader reader = null; 
    try { 
     reader = new CSVReader(new FileReader(itemsFile), '\t'); 
    } catch (FileNotFoundException e) { 
     System.out.println(e.getMessage()); 
     e.printStackTrace(); 
    } 

    String[] nextLine; 
    HashSet<String> brands = new HashSet<>();    
    while ((nextLine = reader.readNext()) != null) { 
     brands.add(nextLine[4]);    
    }    

    String[] brandArray = new String[brands.size()]; 
    Iterator<String> it = ((HashSet<String>) brands).iterator(); 
    int listNum = 0; 
    while (it.hasNext()) { 
     Object brand = (Object) it.next(); 
     brandArray[listNum] = (String) brand; 
     listNum++; 
    } 

    CSVWriter writer = new CSVWriter(new FileWriter(outFile), '\n'); 
    writer.writeNext(brandArray);   
    writer.close(); 
} 

Przepraszam jeśli mój kod jest brudny to mój pierwszy prawdziwy „Zakończony” aplikacja Java. Każda pomoc jest doceniana.

Mam nawet próbował usunąć te wiersze z pliku txt, aby upewnić się, że nie wisi na jakimś charakterem czy coś, ale wydaje się, aby zatrzymać się na tej linii i tak

+0

Czy wydrukowałeś rozmiar kolekcji, aby lepiej zrozumieć, co się dzieje? Czy próbowałeś umieścić punkt przerwania w swoim programie, gdy osiągnie ostatnią linię odczytu, aby zobaczyć, co się wali? – assylias

+1

Dodaje się również elementy do haszyszu, które nie mogą zawierać duplikatów. Tak więc jeśli ten sam ciąg zostanie znaleziony więcej niż raz, zostanie dodany tylko raz. Najprawdopodobniej to się dzieje. Zastąp HashSet przez ArrayList i sprawdź, czy działa lepiej. – assylias

+0

@assylias Próbowałem zmienić na Arraylist, ale mam taki sam wynik. Używam HashSet, ponieważ nie chcę duplikatów. Zorientowałem się, na której linii zatrzymał się, dodając licznik do pętli while, która dodaje wartości do hashset. Spróbuję jednak dodać punkt przerwania i zobaczyć, co się stanie. – Hirthas

Odpowiedz

8

OK I zdobione to dzięki użytkownik @ Michael na czacie. Wygląda na to, że openCSV nie może obsłużyć tak dużego pliku, ponieważ nie jest on przesyłany strumieniowo. TAK Spojrzałem na streaming tego pliku i działa świetnie.

Oto kod końcowy:

public static void main(String[] args) throws IOException { 

    String fileName = new String(); 
    fileName = "items.txt"; 
    String outputFile = new String(); 
    outputFile = "so.txt";  
    String thisLine; 
    HashSet<String> brand = new HashSet<>(); 
    FileInputStream fis = new FileInputStream(fileName); 
    @SuppressWarnings("resource") 
    BufferedReader myInput = new BufferedReader(new InputStreamReader(fis)); 
    while ((thisLine = myInput.readLine()) != null) { 
     String[] line = thisLine.split("\t"); 
     if (line[20].equals("1")) { 
      if (!line[2].equals("") && !line[2].equals(" ") 
        && !line[2].equals(null)) {     
       if(line[2].indexOf("'") > -1){ 
        System.out.println(line[2]); 
        line[2] = line[2].replace("'", "\'"); 
        System.out.println(line[2]); 
       } 

       brand.add(line[2]); 
      } 
     } 
     if (!line[3].equals("") && !line[3].equals(" ") 
       && !line[3].equals(null)) {    
       line[3] = line[3].replace("'", "\'");    
      brand.add(line[3]); 
     } 
     if (!line[4].equals("") && !line[4].equals(" ") 
       && !line[4].equals(null)) { 
      if(line[4].indexOf("'") > -1){ 
       System.out.println(line[4]); 
       line[4] = line[4].replace("'", "\'"); 
       System.out.println(line[4]); 
      } 


      brand.add(line[4]); 
     } 
    } 

    String[] brands = brand.toArray(new String[brand.size()]); 

    try { 
     FileWriter fstream = new FileWriter(outputFile); 
     BufferedWriter bw = new BufferedWriter(fstream); 
     for (int i = 0; i < brands.length; i++) { 

      if (i == 0) { 
       bw.write("'" + brands[i] + "'"); 
      } else { 
       bw.write(",'" + brands[i] + "'"); 
      } 
     }   

     bw.close(); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

Dzięki za każdym pomoc w tej sprawie.

Powiązane problemy