簡體   English   中英

在 Java 中忽略 CSV 文件中的空行

[英]Ignoring blank lines in CSV file in Java

我正在嘗試用 Java 遍歷 CSV 文件。 它遍歷整個文件,但會到達文件末尾並嘗試讀取下一個空行並拋出錯誤。 我的代碼如下。

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)收到錯誤Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at com.ucg.layout.ShelfTableUpdates.main(ShelfTableUpdates.java:23) 我已經通過在 Spring Tool Suite 中調試代碼來逐步完成代碼。 每當我嘗試引用 data[0] 或 data[6] 時都會出現錯誤; 可能是因為該行中沒有任何內容。 這讓我回到了我最初的問題,即為什么它甚至試圖首先閱讀該行。

我的理解是while ((line = br.readLine()) != null)會檢測到文件的結尾,但似乎不是。 我試過重新打開文件並刪除所有空白行,但這沒有用。

知道如何檢測文件的結尾以便我不會在此代碼中收到錯誤嗎?

答案:歸功於用戶@quemeraisc。 我還能夠用空格替換逗號,如果該行等於 null 或“”,那么您就知道它是文件的結尾; 就我而言,文件末尾之前沒有空白行。 這仍然不能解決檢測文件末尾的問題,因為如果我的數據之間確實有不是 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;
}

只需跳過所有空行:

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

最后一行可能包含一些控制字符(如換行符、回車符、EOF 和其他不可見字符),在這種情況下,簡單的 String#trim() 不會刪除它們,請參閱此答案以了解如何刪除它們: How我可以從java字符串中刪除所有控制字符嗎?

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 個元素。

要跳過空行,您可以嘗試:

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

使用 replaceAll 方法代替 replace 方法。 然后它會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM