以下方法允许使用跳过标题阅读:
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)
不起作用并且具有相同的行为
答案 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 文件中列顺序更改的影响。