如何读取csv,因为包含在apache commons中的头文件csv?

时间:2017-11-09 13:01:27

标签: java csv parsing header apache-commons-csv

以下方法允许使用跳过标题阅读:

Iterable<CSVRecord> records = CSVFormat.EXCEL.withHeader().parse(in);

for (CSVRecord record : records) {
     //here first record is not header
}

如何从标题行开始读取csv?

P.S。

的方法:

CSVFormat.EXCEL.withHeader().withSkipHeaderRecord(false).parse(in)

不起作用并且具有相同的行为

2 个答案:

答案 0 :(得分:2)

对我而言,以下所有人似乎都将头记录作为第一个(使用commons-csv 1.5)

Iterable<CSVRecord> records = CSVFormat.EXCEL.parse(in);
Iterable<CSVRecord> records = CSVFormat.EXCEL.withSkipHeaderRecord().parse(in); //???
Iterable<CSVRecord> records = CSVFormat.EXCEL.withSkipHeaderRecord(false).parse(in); 
Iterable<CSVRecord> records = CSVFormat.EXCEL.withSkipHeaderRecord(true).parse(in); //???

正如你所说,以下似乎没有头记录作为第一个

Iterable<CSVRecord> records = CSVFormat.EXCEL.withHeader().parse(in); //???

我无法理解为什么withSkipHeaderRecord()和withSkipHeaderRecord(true)确实包含标题而withHeader()没有;似乎与方法名称建议的相反的行为

答案 1 :(得分:1)

withHeader() 方法告诉解析器文件有一个标题。可能方法名称有点混乱。

withFirstRecordAsHeader() 方法也可能有用。

来自 CSVFormat (Apache Commons CSV 1.8 API) JavaDoc 页面:

<块引用>

安全地引用列

如果您的源包含标题记录,您可以使用不带参数的 withHeader(String...) 来简化代码并安全地引用列:

CSVFormat.EXCEL.withHeader();

这会导致解析器读取第一条记录并将其值用作列名。然后,调用采用 String 列名称参数的 CSVRecord get 方法之一:

String value = record.get("Col1");

这使您的代码不受 CSV 文件中列顺序更改的影响。