2013-02-20 3 views
5

У меня есть приложение на Java, которое я использую openCSV для чтения файла (очень большого). Затем я помещаю 4-й (в конце концов, столбец или два добавленных, если это имеет значение) столбец в HashSet и выводя его в новый файл. Все это работает нормально, но я обнаружил, что он читает только часть файла (131 544 строки из 272 948). Является ли это ограничением openCSV или Java вообще или есть способ обойти это?openCSV не читает весь мой файл

Мой код для справки:

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

Я прошу прощения, если мой код грязный это мой первый реальный «Завершена» приложение Java. Любая помощь очень ценится.

Я даже попытался удалить эти строки из текстового файла, чтобы убедиться, что он не висит на какой-то характер или что-то, но это, кажется, остановиться на этой линии в любом случае

+0

Вы напечатали размер коллекций, чтобы лучше понять, что происходит? Вы пытались установить контрольную точку в своей программе, когда она достигает последней строки чтения, чтобы увидеть, что происходит? – assylias

+1

Также вы добавляете элементы в хешсет, который не может содержать дубликаты. Таким образом, если одна и та же строка будет найдена больше, если она будет добавлена ​​только один раз. Скорее всего, это то, что происходит. Замените HashSet на ArrayList и посмотрите, работает ли он лучше. – assylias

+0

@assylias Я попытался перейти к Arraylist, но получил тот же результат. Я использую HashSet, потому что я не хочу дубликатов. Я выяснил, в какой строке он остановился, добавив счетчик цикла while, который добавляет значения в hashset. Я попробую добавить точку останова и посмотреть, что произойдет. – Hirthas

ответ

8

OK Я понял это благодаря пользователю @ Майкл в чате. Очевидно, openCSV не может обрабатывать такой большой файл, потому что он не потоковый. Итак, я просмотрел этот файл, и он отлично работает.

Вот код конца:

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

Спасибо за помощь каждого на это.

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