[英]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.