2013-02-20 31 views
5

Tôi có một ứng dụng trong Java mà tôi đang sử dụng openCSV để đọc tệp (rất lớn). Sau đó tôi đặt cột thứ 4 (Cuối cùng sẽ có một hoặc hai cột được thêm vào nếu điều này tạo ra sự khác biệt) thành một HashSet và xuất nó ra một tệp mới. Điều này tất cả dường như làm việc tốt nhưng tôi phát hiện ra nó chỉ đọc một phần của tập tin (131.544 dòng 272,948). Đây có phải là một hạn chế của openCSV hoặc Java nói chung hoặc có cách nào để giải quyết vấn đề này không?openCSV không đọc toàn bộ tệp của tôi

Mã của tôi để tham khảo:

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(); 
} 

Tôi xin lỗi nếu mã của tôi là lộn xộn này là có thật "Hoàn thành" ứng dụng đầu tiên của tôi Java. Bất kỳ hỗ trợ nào được đánh giá cao.

Tôi thậm chí đã cố gắng loại bỏ những dòng từ file txt để đảm bảo nó không treo lên trên một số nhân vật hoặc một cái gì đó nhưng nó dường như dừng lại trên dòng đó anyway

+0

Bạn đã in kích thước của bộ sưu tập để hiểu rõ hơn điều gì sẽ xảy ra? Bạn đã thử đặt một điểm ngắt trong chương trình của bạn khi nó đạt đến dòng đọc cuối cùng để xem những gì đi vẫy? – assylias

+1

Ngoài ra, bạn thêm các mục vào một bộ băm, không thể chứa các bản sao. Do đó nếu cùng một chuỗi được tìm thấy nhiều hơn tthan một khi nó sẽ chỉ được thêm một lần. Đó là nhiều khả năng những gì đang xảy ra. Thay thế HashSet bởi ArrayList và xem nó có hoạt động tốt hơn không. – assylias

+0

@assylias Tôi đã thử thay đổi thành Arraylist nhưng tôi nhận được kết quả tương tự. Tôi đang sử dụng một HashSet vì tôi không muốn bản sao. Tôi đã tìm ra dòng nào nó dừng lại bằng cách thêm một bộ đếm vào vòng lặp while để thêm giá trị vào hashset. Tôi sẽ thử thêm một điểm break mặc dù và xem những gì sẽ xảy ra. – Hirthas

Trả lời

8

OK I figured này ra nhờ sử dụng @ Michael đang trò chuyện. Rõ ràng openCSV không thể xử lý một tệp lớn như vậy vì nó không phải là luồng. Vì vậy, tôi đã xem trực tiếp tệp này và nó hoạt động rất tốt.

Dưới đây là mã kết thúc:

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(); 
    } 
} 

Nhờ sự giúp đỡ của mọi người về vấn đề này.

Các vấn đề liên quan