【问题标题】:csvParser.getRecords() returns empty when there are records in CSVParser当 CSVParser 中有记录时,csvParser.getRecords() 返回空
【发布时间】:2018-09-24 11:43:16
【问题描述】:

我正在使用以下依赖项来读取 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 文件中的总行数。我该怎么做?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 它应该被分配给一些列表变量。那应该没问题。 “for(CSVRecord csvRecord: csvParser.getRecords()) { System.out.println(csvRecord.get(0)); }” 为空。
    【解决方案2】:

    你可以在streamfor上做任何你可以做的事情,所以你应该可以

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

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

    【讨论】:

      【解决方案3】:

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

      这一个班轮可以做到:

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

      希望这会有所帮助。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2017-01-08
          • 1970-01-01
          • 2020-10-26
          • 1970-01-01
          • 2016-04-16
          • 1970-01-01
          • 2012-08-26
          • 2014-07-16
          • 2017-09-22
          相关资源
          最近更新 更多