Как читать CSV начиная с заголовка включительно в Apache Commons CSV?
Следующий подход позволяет читать с пропуском заголовка:
Iterable<CSVRecord> records = CSVFormat.EXCEL.withHeader().parse(in);
for (CSVRecord record : records) {
//here first record is not header
}
Как я могу прочитать CSV начиная с заголовка включительно?
PS
подход:
CSVFormat.EXCEL.withHeader().withSkipHeaderRecord(false).parse(in)
не работает и имеет такое же поведение
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() - нет; кажется противоположное поведение относительно того, что предлагают имена методов
В
withHeader()
сообщает синтаксическому анализатору, что файл имеет заголовок. Возможно, название метода сбивает с толку.
В
withFirstRecordAsHeader()
также может быть полезен.
На странице JavaDoc CSVFormat (Apache Commons CSV 1.8 API) :
Безопасная ссылка на столбцы
Если ваш источник содержит запись заголовка, вы можете упростить свой код и безопасно ссылаться на столбцы, используя
withHeader(String...)
без аргументов:CSVFormat.EXCEL.withHeader();
Это заставляет синтаксический анализатор читать первую запись и использовать ее значения в качестве имен столбцов. Затем позвоните в один из
CSVRecord
get метод, который принимает аргумент имени столбца String:String value = record.get("Col1");
Это делает ваш код невосприимчивым к изменениям порядка столбцов в CSV-файле.