猿问

为 csvReader 跳过循环

所以,我有这种情况:我有两个 .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[](在我向您展示的代码之外初始化)


摇曳的蔷薇
浏览 202回答 3
3回答

慕桂英546537

当外循环的第一次迭代完成内循环时,cvsReader将达到 EOF,因此任何进一步的调用csvReader.readNext()都将返回 null。一种解决方案是不嵌套循环,而是首先将其中一个文件读入数组或其他集合,然后在读取第二个数组时对该数组进行处理。

慕运维8079593

内部 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) {&nbsp; &nbsp; System.out.println(nextPM[0]);&nbsp; &nbsp; for (String[] nextRecord : allRecords) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(nextRecord[0] + "asd");&nbsp; &nbsp; &nbsp; &nbsp; if(nextRecord[0].equals(nextPM[0])) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(nextRecord[0] + " " + nextRecord[1] + " " + nextPM[2]);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}

慕后森

您可以将csvReaderin的声明和初始化移动到内部循环开始上方的第一个 while 循环中。这样做可以为内循环的每次迭代创建一个新的读取器:&nbsp; &nbsp;while ((nextPM = csvReader2.readNext()) != null) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(nextPM[0]);&nbsp; &nbsp; &nbsp; &nbsp; CSVReader csvReader = new CSVReader(new FileReader("yourfile.csv"));&nbsp; &nbsp; &nbsp; &nbsp; while ((nextRecord = csvReader.readNext()) != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(nextRecord[0] + "asd");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(nextRecord[0].equals(nextPM[0])) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(nextRecord[0] + " " + nextRecord[1] + " " + nextPM[2]);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }
随时随地看视频慕课网APP

相关分类

Python
我要回答