3

我正在使用以下依赖项来读取 csv 文件:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.5</version>
</dependency>

下面是我为读取 csv 文件而编写的代码:

Reader reader = Files.newBufferedReader(Paths.get(file.getPath()));
CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT);
for(CSVRecord csvRecord: csvParser) {
     System.out.println(csvRecord.get(0));
}

我可以通过上述方法从 csv 文件中读取每一行。但是 csvParser.getRecords(); 返回空。我想要 CSV 文件中的总行数。我怎样才能做到这一点?

4

4 回答 4

4

仔细阅读getRecords() javadoc (重点是我的):

返回的内容从流中的当前解析位置开始。

你说 :

但是 csvParser.getRecords(); 返回空。我想要 CSV 文件中的总行数。我怎样才能做到这一点?

您必须csvParser.getRecords().size();在迭代记录之前调用。然后迭代它们。

例如 :

List<Records> records = csvParser.getRecords();
int nbRecords = records.size();
for(CSVRecord csvRecord: records) {
     System.out.println(csvRecord.get(0));
}
于 2018-09-24T11:52:48.257 回答
0

你可以stream做任何你可以做for的事情,所以你应该能够

StreamSupport.stream(csvParser.spliterator(), false).count()

注意:它仍然会以这种方式分配记录(不必要地)。

于 2018-09-24T11:48:19.987 回答
0

我认为它应该分配给数组 list ,因为 CSVParser 释放了 List 的内存`

CSVParser csvParser = CSVParser.parse(multipartFileStream, StandardCharsets.US_ASCII,
                CSVFormat.EXCEL);
                List<CSVRecord> listCsvRecord =  new ArrayList<>();
                listCsvRecord.addAll(csvParser.getRecords());
            `
于 2020-03-13T23:39:35.973 回答
0

univocity-parsers有一个内置的getInputDimension例程,可以为您提供该信息 - 它应该比您使用 commons-csv 尝试的任何方法至少快 6 倍。

这一个班轮将做到这一点:

int lines = new CsvRoutines().getInputDimension(new File("/path/to/your.csv")).rowCount();

希望这可以帮助。

免责声明:我是这个库的作者。它是开源和免费的(Apache 2.0 许可证)

于 2018-09-26T06:58:37.870 回答