2016-05-17 2 views
0

Я пытаюсь выполнить итерацию через CSV-файл в Java. Он выполняет итерацию по всему файлу, но дойдет до конца файла и попытается прочитать следующую пустую строку и выбросить ошибку. Мой код ниже.Игнорирование пустых строк в CSV-файле в Java

public class Loop() { 
public static void main(String[] args) { 
    BufferedReader br = null; 
    String line = ""; 

    try { 
     HashMap<Integer, Integer> changeData = new HashMap<Integer, Integer>(); 
     br = new BufferedReader(new FileReader("C:\\xxxxx\\xxxxx\\xxxxx\\the_file.csv")); 
     String headerLine = br.readLine(); 

     while ((line = br.readLine()) != null) { 
      String[] data = line.split(","); 

      /*Below is my latest attempt at fixing this,*/ 
      /*but I've tried other things too.*/ 
      if (data[0].equals("")) { break; } 

      System.out.println(data[0] + " - " + data[6]); 
      int changeId = Integer.parseInt(data[0]); 
      int changeCv = Integer.parseInt(data[6]); 

      changeData.put(changeId, changeCv); 
     } 
    } catch (IOException e) { 
     e.printStackTrace();  
    } 
} 
} 

Как я набрал, это работает нормально, пока не дойдет до конца файла. Когда он дойдет до конца файла, я получаю сообщение об ошибке Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at com.ucg.layout.ShelfTableUpdates.main(ShelfTableUpdates.java:23). Я прошел через код, отлаживая его в Spring Tool Suite. Ошибка возникает, когда я пытаюсь ссылаться на данные [0] или данные [6]; вероятно, потому что в этой строке ничего нет. Это возвращает меня к моему первоначальному вопросу о том, почему он даже пытается прочесть эту строку в первую очередь.

Было мое понимание, что while ((line = br.readLine()) != null) обнаружит конец файла, но, похоже, это не так. Я попытался повторно открыть файл и удалить все пустые строки, но это не сработало.

Любая идея, как я могу определить конец файла, чтобы я не получил ошибку в этом коде?

ОТВЕТ: Кредит предоставляется пользователю @quemeraisc. Я также смог заменить запятые пробелами, и если строка тогда равна нулю или «", то вы знаете, что это конец файла; в моем случае, нет пустых строк до конца файла. Это все еще не решает проблему обнаружения конца файла в том случае, если у меня были пустые строки между моими данными, которые не были EOF, тогда это обнаружит их.

Решение 1:

if (data.length < 7) { 
    System.out.println(data.length); 
    break; 
} 

Решение 1:

if (line.replace(",", "").equals(null) || line.replace(",", "").equals("")) { 
    System.out.println(line.replace(",", "")); 
    break; 
} 
+0

Я запускал вашу программу по мере ее публикации и не получал ошибку. – Lani1234

ответ

1

public String readLine() будет читать строку из вашего файла, даже пустые строки. Таким образом, когда вы разделяете свою линию, как в String[] data = line.split(","); вы получите массив размера 1. Почему бы не попробовать:

if (data.length >= 7) 
{ 
    System.out.println(data[0] + " - " + data[6]); 
    int changeId = Integer.parseInt(data[0]); 
    int changeCv = Integer.parseInt(data[6]); 
    changeData.put(changeId, changeCv); 
} 

который удостоверится есть, по крайней мере 7 элементов в массиве, прежде чем продолжить.

2

Просто пропустить все пустые строки:

while ((line = br.readLine()) != null) { 
    if(line.trim().isEmpty()) { 
      continue; 
    } 
    .... 
    .... 

Последняя строка может содержать некоторые управляющие символы (как новая линия, каретка r eturn, EOF и другие незаметные символы), в этом случае простой строка # облицовка() не удаляют их, увидеть этот ответ, чтобы узнать, как удалить их: How can i remove all control characters from a java string?

+0

Спасибо за ваш ответ. Я пробовал это, и он не работает. Он по-прежнему признает пустые строки не пустыми. – aCarella

+0

Hart сказать, не видя содержимого файла. Вам нужно отладить код и проверить, что содержит эта строка. Сделайте копию файла, удалите все строки, кроме тех, которые вызывают проблему, затем установите breakpoin сразу после 'while', запустите программу в отладчике и проверьте, что находится в этой строке. – krokodilko

0

пропускать пустые строки, которые вы можете попробовать:

while ((line = reader.readLine()) != null) { 
    if(line.length() > 0) { 
     String[] data = line.split(","); 

     /*Below is my latest attempt at fixing this,*/ 
     /*but I've tried other things too.*/ 
     if (data[0] == null || data[0].equals("")) { break; } 

     System.out.println(data[0] + " - " + data[6]); 
     int changeId = Integer.parseInt(data[0]); 
     int changeCv = Integer.parseInt(data[6]); 

     changeData.put(changeId, changeCv); 
    }   
} 
+0

Спасибо за ваш ответ. Я попробовал это, и он, похоже, не работает.Он по-прежнему возвращает длину пустой строки как 17, хотя пустая строка читается в моей консоли как ',,,,,,,,,,,,,,,,'. – aCarella

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