为什么 CSVParser 正在读取下一个 CSVRecord
Why is CSVParser is reading the next CSVRecord
使用 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
等...
所以我的问题是 CSVParser 在 parser.hasNext()
上跳过了一行,它不应该。
我的代码有错吗?
我很确定如果我用 ArrayList 替换解析器,迭代器会按预期工作......
这是一个已知的错误?
如果是的话,你们能指出一个解决方法或更好的库吗?
嗯,默认情况下,解析器将第一行视为 header(列定义),因此在返回的记录中会跳过它。要包含此行,您必须使用 withSkipHeaderRecord.
相应地准备格式
编辑:
对不起,我读得太快了。我以为只跳过了第一行。
你遇到的问题是每次迭代调用 iterator()
,其中 returns 一个新的 Iterator
。
过了这一点事情变得很奇怪,因为迭代器有一个 current
字段存储当前记录,当然新迭代器的当前记录是 null
.
在这种情况下,它从 CSVParser (source code) 调用 getNextRecord()
,从而跳过一行。
如果您想坚持使用迭代器,只需重新使用相同的实例即可:
Iterator<CSVRecord> iterator = parser.iterator();
while(iterator.hasNext()) {
console.log(iterator.next().get(0).trim());
}
使用 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
等...
所以我的问题是 CSVParser 在 parser.hasNext()
上跳过了一行,它不应该。
我的代码有错吗? 我很确定如果我用 ArrayList 替换解析器,迭代器会按预期工作...... 这是一个已知的错误? 如果是的话,你们能指出一个解决方法或更好的库吗?
嗯,默认情况下,解析器将第一行视为 header(列定义),因此在返回的记录中会跳过它。要包含此行,您必须使用 withSkipHeaderRecord.
相应地准备格式编辑: 对不起,我读得太快了。我以为只跳过了第一行。
你遇到的问题是每次迭代调用 iterator()
,其中 returns 一个新的 Iterator
。
过了这一点事情变得很奇怪,因为迭代器有一个 current
字段存储当前记录,当然新迭代器的当前记录是 null
.
在这种情况下,它从 CSVParser (source code) 调用 getNextRecord()
,从而跳过一行。
如果您想坚持使用迭代器,只需重新使用相同的实例即可:
Iterator<CSVRecord> iterator = parser.iterator();
while(iterator.hasNext()) {
console.log(iterator.next().get(0).trim());
}