亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為 csvReader 跳過循環

為 csvReader 跳過循環

搖曳的薔薇 2021-09-29 10:13:46
所以,我有這種情況:我有兩個 .csv 文件,我需要讀取和保存它們的數據。問題在這里:while ((nextPM = csvReader2.readNext()) != null) {    System.out.println(nextPM[0]);    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]);        }    }}第一次完美運行,但是當第一個 while 循環再次開始時,第二個 while 將被跳過。有什么解決辦法嗎?當然nextPM并且nextRecord是String[](在我向您展示的代碼之外初始化)
查看完整描述

3 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

當外循環的第一次迭代完成內循環時,cvsReader將達到 EOF,因此任何進一步的調用csvReader.readNext()都將返回 null。

一種解決方案是不嵌套循環,而是首先將其中一個文件讀入數組或其他集合,然后在讀取第二個數組時對該數組進行處理。


查看完整回答
反對 回復 2021-09-29
?
慕運維8079593

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

        }

    }

}


查看完整回答
反對 回復 2021-09-29
?
慕后森

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

            }

        }

    }


查看完整回答
反對 回復 2021-09-29
  • 3 回答
  • 0 關注
  • 223 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號