Java读取带有多个标头的csv文件

时间:2016-08-15 06:30:29

标签: java csv apache-commons-csv

我正在使用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

根据谷歌(没有标题)和两个标题 TOP RISING 的数据,我无法提取所需的值。是否有任何过滤配置我可以申请获得所需的值?

1 个答案:

答案 0 :(得分:0)

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

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文件,这个解决方案可能会证明有问题。仍然可能对某人有用。