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