CSVParser中有记录时,csvParser.getRecords()返回空

时间:2018-09-24 11:43:16

标签: java csv java-8 apache-commons-csv

我正在使用以下依赖项来读取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 个答案:

答案 0 :(得分:3)

仔细阅读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));
}

答案 1 :(得分:0)

您可以stream进行for的操作,因此您应该可以

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

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

答案 2 :(得分:0)

univocity-parsers具有内置的getInputDimension例程,该例程可为您提供该信息-它应至少比commons-csv尝试的速度快6倍。

这只班轮可以做到:

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

希望这会有所帮助。

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

答案 3 :(得分:0)

我认为应该将其分配给数组列表,因为CSVParser释放了列表`

的内存
CSVParser csvParser = CSVParser.parse(multipartFileStream, StandardCharsets.US_ASCII,
                CSVFormat.EXCEL);
                List<CSVRecord> listCsvRecord =  new ArrayList<>();
                listCsvRecord.addAll(csvParser.getRecords());
            `