2

使用org.apache.commons.csv.CSVParser我有一个奇怪的行为。

我正在尝试逐行读取由 分隔的 csv 文件,;但我的解析器由于未知原因正在跳过行。

这是我的代码:

public static void main(String[] args) {
    try (
        File file = new File("myFile.csv");
        Reader reader = new BufferedReader(new FileReader(file));
        CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.withDelimiter(';'));
    ) {
        if (!parser.iterator().hasNext()) {
            throw new RuntimeException("The file is empty.");
        }
        while(parser.hasNext()) { //<----- This skip a line! 
            console.log(parser.iterator().next().get(0).trim());
        }
    }
}

所以我的控制台看起来像:

line2
line4
line6
line8
line10
line12

ETC...

所以我的问题是 CSVParser 正在跳过一行parser.hasNext(),它不应该。

我的代码错了吗?我很确定如果我用 ArrayList 替换解析器,迭代器会按预期工作......这是一个已知的错误吗?如果是的话,你们能指出解决方法或更好的图书馆吗?

4

2 回答 2

2

您遇到的问题是每次迭代都调用它iterator(),它返回一个 NEW Iterator

事情变得很奇怪,因为迭代器有一个current存储当前记录的字段,当然新迭代器的当前记录是null.

在这种情况下,它getNextRecord()从 CSVParser(源代码)调用,从而跳过一行。

如果您想坚持使用迭代器,只需重复使用相同的实例:

Iterator<CSVRecord> iterator = parser.iterator();

while(iterator.hasNext()) { 
    console.log(iterator.next().get(0).trim());
}
于 2018-04-16T15:05:08.480 回答
-1

好吧,默认情况下,解析器将第一行视为标题(列定义),因此在返回的记录中将其跳过。要包含此行,您必须使用withSkipHeaderRecord相应地准备格式。

编辑:对不起,我读得太快了。我以为只有第一行被跳过了。

于 2018-04-16T14:51:49.300 回答