3 回答

TA貢獻1848條經驗 獲得超10個贊
當外循環的第一次迭代完成內循環時,cvsReader
將達到 EOF,因此任何進一步的調用csvReader.readNext()
都將返回 null。
一種解決方案是不嵌套循環,而是首先將其中一個文件讀入數組或其他集合,然后在讀取第二個數組時對該數組進行處理。

TA貢獻1876條經驗 獲得超5個贊
內部 while 循環將繼續讀取記錄,csvReader直到沒有要讀取的記錄為止。
csvReader不會因為 while 循環結束而“重置”:閱讀器已完成。因此,下次您嘗試從中讀取記錄時,它會立即返回;csvReader是仍然在最后。
要解決這個問題,您必須以某種方式重置csvReader回開始。大多數流樣式的 Java API 故意不支持reset(因為許多數據源沒有“請重新開始”的概念)。因此,要“重置”它,您必須在外循環內重新創建它,從而保證csvReader 每次循環時都有一個全新的。
如果您的源材料是文件,這可能會很慢。如果是網絡連接,這是不可能的。但是,還有另一種解決方案:您可以從csvReader一遍讀取記錄并將它們保存在內存中,然后通過您的內存副本進行。如果源非常大(您需要大量 RAM),這是不可行的,但假設它不是:
// Save all records in csvReader into a list.
List<String[]> allRecords = new ArrayList<>();
while ((String[] record = csvReader.readNext()) != null) allRecords.add(record);
然后在您的內部循環中使用此列表:
while ((nextPM = csvReader2.readNext()) != null) {
System.out.println(nextPM[0]);
for (String[] nextRecord : allRecords) {
System.out.println(nextRecord[0] + "asd");
if(nextRecord[0].equals(nextPM[0])) {
System.out.println(nextRecord[0] + " " + nextRecord[1] + " " + nextPM[2]);
}
}
}

TA貢獻1802條經驗 獲得超5個贊
您可以將csvReaderin的聲明和初始化移動到內部循環開始上方的第一個 while 循環中。這樣做可以為內循環的每次迭代創建一個新的讀取器:
while ((nextPM = csvReader2.readNext()) != null) {
System.out.println(nextPM[0]);
CSVReader csvReader = new CSVReader(new FileReader("yourfile.csv"));
while ((nextRecord = csvReader.readNext()) != null) {
System.out.println(nextRecord[0] + "asd");
if(nextRecord[0].equals(nextPM[0])) {
System.out.println(nextRecord[0] + " " + nextRecord[1] + " " + nextPM[2]);
}
}
}
添加回答
舉報