忽略Java中CSV文件中的空行

时间:2016-05-17 19:59:50

标签: java csv io iteration bufferedreader

我正在尝试用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)。我通过在Spring Tool Suite中调试代码来逐步完成代码。每当我尝试引用数据[0]或数据[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;
}

4 个答案:

答案 0 :(得分:2)

只需跳过所有空行:

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

最后一行可能包含一些控制字符(如新行,回车符,EOF和其他不可见的字符),在这种情况下,一个简单的String#trim()不会删除它们,请参阅此答案以了解如何删除他们:How can i remove all control characters from a java string?

答案 1 :(得分: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 :(得分: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);
   }           
}

答案 3 :(得分:0)

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