【问题标题】:How to read specific columns from CSV file?如何从 CSV 文件中读取特定列?
【发布时间】:2014-01-14 12:44:01
【问题描述】:

我有一个包含 5 个字段(列)的 csv 文件。在 5 列中,我只想阅读进一步处理所需的第二和第四列。 现在我正在使用 opencsv api 的 readAll() 方法来读取。 通过使用这种方法,我必须处理所有列以获得第二列和第四列的值。

有没有办法读取所需列的值,即从 csv 文件中读取第二个和第四个值?

这是正确的方法还是我应该使用其他方法?

【问题讨论】:

  • 即使您必须阅读所有 5 个字段,丢弃不需要的字段有什么问题?
  • @PeterMmm 我想知道是否有其他方法可以通过标题名称读取 csv 文件。如果我指定标题,则只应读取该标题下的数据..
  • 我能想到的唯一合理的方式需要结构化(csv-)文件。 IE。文件中的每个字段都有一个已知的固定大小。如果您有任意长度的字段,您可以开始根据可能性进行猜测搜索。享受实施。我宁愿建议将 csv 导入 DBS。
  • 你一定要使用open csv api吗?

标签: java csv


【解决方案1】:

如果性能是一个问题,从您的问题来看,我建议您实现自己的解析器。 opencsv 不提供这样的功能。可能是因为性能上的胜利不会那么大。

【讨论】:

    【解决方案2】:

    我不这么认为。

    为了确定哪一列具有哪个索引,csv 解析器必须处理整行或至少处理到您要拥有的最后一列(在您的情况下是第四列)。即使您的数据是固定长度的,您仍然必须阅读整行,以便了解子字符串的边界。

    如果内存使用是个问题,那么使用CSVReader#readAll() 不是最佳选择。在这种情况下,我建议改用 CSVReader#iterator() 并通过返回数组的索引访问您的列,例如myCsvRow[1]myCsvRow[3]

    【讨论】:

      【解决方案3】:

      使用 Commons CSV,您可以遍历 csv 元素并使用列标签读取特定列。

      注意:(常见的 CSV 是 openCsv 和其他 csv 解析器的统一)。 http://commons.apache.org/proper/commons-csv/

      要读取特定列,您可以将每个 csvRecord 转换为 Map 并获取其值,如下所示:

      List<CSVRecord> aCSVList == aCSVParser.getRecords();
      ...
      for (CSVRecord aCSVRecord : aCSVList)
      {
         ...
          Map<String, String> aCurrentMap = aCSVRecord.toMap();
          aCurrentMap.get("ColumnLabel");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-14
        • 2013-05-06
        相关资源
        最近更新 更多