2013-02-20 17 views
5

Java'da bir uygulamayı kullanmak için openCSV kullanıyorum (çok büyük). Daha sonra 4. (daha sonra bu bir fark yaratan başka bir sütun veya iki tane eklenir) sütunu bir HashSet'e koyup bunu yeni bir dosyaya vereceğim. Hepsi iyi çalışıyor gibi görünüyor ama sadece dosyanın bir kısmını okuduğunu keşfettim (131.544 satır 272.948). Bu, genel olarak openCSV veya Java'nın bir sınırlaması mıdır yoksa bu konuyla ilgilenmenin bir yolu var mı? referans içinopenCSV Tüm dosyam okunmuyor

Kodum:

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

benim kod dağınık ise bu benim ilk gerçek "Tamamlandı" Java uygulamasıdır dileriz. Herhangi bir yardım çok takdir edilmektedir.

Hatta bazı karakter ya da bir şey üzerinde asılı değil emin olmak için Metin dosyasından bu satırları kaldırarak denedim

ama ben kullanıcıya sayesinde bu anladım zaten

+0

Ne olacağını daha iyi anlamak için koleksiyonların boyutunu yazdırdınız mı? Neyin tükendiğini görmek için son okuma çizgisine ulaştığında programınızda bir kesme noktası koymaya çalıştın mı? – assylias

+1

Ayrıca, çiftleri içeremeyen bir hashset öğesine öğe eklersiniz. Aynı dizgenin yalnızca bir kez eklendiğinde daha fazla tthan bulunması durumunda. Bu büyük olasılıkla oluyor. HashSet'i ArrayList ile değiştirin ve daha iyi çalışıp çalışmadığını görün. – assylias

+0

@assylias Bir Arraylist’e geçmeyi denedim ama aynı sonucu elde ediyorum. Bir HashSet kullanıyorum çünkü çoğaltmak istemiyorum. While döngüsüne, hashset'e değer ekleyen bir sayaç ekleyerek hangi satırın durduğunu çözdüm. Yine de bir mola noktası eklemeye çalışacağım ve ne olduğunu göreceğim. – Hirthas

cevap

8

Tamam o hat üzerinde durmak gibi görünüyor @ Michael sohbette. Görünüşe göre openCSV, böyle bir büyük dosyayı işleyemiyor çünkü akış değil. Bu dosyayı akışına baktım ve harika çalışıyor. Bu konuda herkesin yardım için

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

Teşekkür:

İşte son kod.

İlgili konular