【问题标题】:Java reading csv file with multiple headersJava读取具有多个标题的csv文件
【发布时间】:2016-12-21 09:00:56
【问题描述】:

我正在使用 apache commons csv 读取从google trends 下载的 CSV 文件中的内容,该文件在右下角的相关查询部分中下载为 csv。文件的一小部分:

Category: All categories
"bluetooth speakers: (1/1/04 - 8/15/16, Worldwide)"

TOP
speaker,100
bluetooth speaker,100

RISING
portable speakers bluetooth,Breakout
portable speakers,Breakout

我要从文件中读取的代码:

private void readCsv(String inputFilePath) {
    try {
        Reader in = new FileReader(inputFilePath);
        Iterable<CSVRecord> records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse(in);
        for (CSVRecord record : records) {
            String topic = record.get(0);
            if (topic != null && !topic.isEmpty()) {
                System.out.println(topic);
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

输出:

bluetooth speakers: (1/1/04 - 8/15/16, Worldwide)
TOP
speaker
bluetooth speaker
RISING
portable speakers bluetooth
portable speakers

期望的输出:

speaker
bluetooth speaker
portable speakers bluetooth
portable speakers

根据来自谷歌的数据(没有标题)和两个标题 TOPRISING 我无法提取所需的值。是否有任何过滤配置我可以应用以获得所需的值?

【问题讨论】:

  • 您在一个物理文件中有多个个不同的csv“文件”。在将它们解析为 CSV 之前,您必须将它们分开。
  • @JimGarrison 有图书馆可以做吗?

标签: java csv apache-commons-csv


【解决方案1】:

虽然严格来说不是一个好的解决方案,但对于我而言,忽略具有单个元素的记录会消除标题。我仍在寻找/研究解决方案,例如配置或扩展某些类以获得更清洁的解决方案。

private void readCsv(String inputFilePath) {
    try {
        Reader in = new FileReader(inputFilePath);
//            Iterable<CSVRecord> records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse(in);
        Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(in);
        for (CSVRecord record : records) {
            if (record.size() <= 1){
                continue;
            }
            String topic = record.get(0);
            if (topic != null && !topic.isEmpty()) {
                System.out.println(topic);
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这不是一个好的解决方案的原因是因为可能存在许多其他 csv 文件,而该解决方案可能会出现错误。仍然可能对某人有用。

【讨论】:

  • 对我来说,它看起来更像是文件被分成多个部分,由一个空行分隔。第一个空行之前的任何内容都是文件头。空行之后的第一行是节标题。直到下一个空白行的剩余行是部分内容,这就是您所追求的。
  • @Andreas 任何可以过滤 csv 文件的库。我可以使用字符串操作,但不认为这是一个好的解决方案。我是一个使用 csv 的菜鸟,找不到使用 apache lib 的解决方案
  • 怀疑任何图书馆都有。在 CSV 解析器解析语法文本之后,它是为您解释文件的语义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多