跳过了csvReader

时间:2018-09-19 11:51:00

标签: java csv

因此,我遇到这种情况:我有两个.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会被跳过。有什么办法吗?当然nextPMnextRecordString[](在我向您展示的代码之外初始化)

3 个答案:

答案 0 :(得分:1)

当内循环在外循环的第一次迭代中完成时,cvsReader将达到EOF,因此任何进一步的调用csvReader.readNext()将返回null。

一种解决方案是不嵌套循环,而是先将一个文件读入数组或其他集合中,然后在读取第二个数组时对该数组进行处理。

答案 1 :(得分:1)

内部while循环将继续从gradlew run读取记录,直到没有记录可读取为止。

gradle distZip不会仅由于while循环结束而“重置”:阅读器完成。因此,下一次您尝试从中读取记录时,它会立即返回。 csvReader最后还是

要解决此问题,您将不得不以某种方式将csvReader重新设置为开始。大多数流样式的Java API故意不支持csvReader(因为许多数据源不具有“请从头开始”的概念)。因此,要“重置”它,您必须在外部循环内重新创建它,从而确保您每次循环时都拥有全新的csvReader

如果您的原始资料是文件,这可能会很慢。如果是网络连接,则不可能。但是,还有另一种解决方案:您可以一次从reset中读取记录,并将这些记录保存在内存中,然后按内存副本进行操作。如果源非常大(您需要大量的RAM),那么这是不可行的,但前提是它不是:

csvReader

,然后在内部循环中使用此列表:

csvReader

答案 2 :(得分:0)

您可以将reset()的声明和初始化移到内部循环开始上方的第一个while循环中。这样,您可以为内循环的每次迭代创建一个新的阅读器:

csvReader