Как я могу пропустить первую строку csv в Java?

Я хочу пропустить первую строку и использовать вторую в качестве заголовка.

Я использую классы из apache commons csv для обработки файла CSV.

Заголовок файла CSV находится во второй строке, а не в первой (которая содержит координаты).

Мой код выглядит так:

static void processFile(final File file) {
    FileReader filereader = new FileReader(file);
    final CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';');
    CSVParser parser = new CSVParser(filereader, format);
    final List<CSVRecord> records = parser.getRecords();
    //stuff
}

Я наивно думал,

CSVFormat format = CSVFormat.DEFAULT.withFirstRecordAsHeader().withDelimiter(;)

решит проблему, так как он отличается от withFirstRowAsHeader, и я думал, что он обнаружит, что первая строка не содержит точек с запятой и не является записью. Это не так. Я попытался пропустить первую строку (которую CSVFormat, кажется, считает заголовком) с помощью

CSVFormat format = CSVFormat.DEFAULT.withSkipHeaderRecord().withFirstRecordAsHeader().withDelimiter(;);

но это тоже не работает. Что я могу сделать? В чем разница между withFirstRowAsHeader и withFirstRecordAsHeader?


person Medusa    schedule 24.08.2017    source источник
comment
Вы пробовали читать до новой строки перед передачей fileReader синтаксическому анализатору?   -  person Fildor    schedule 24.08.2017


Ответы (5)


Вы можете прочитать первую строку, прежде чем передать читателю CSVParser :

static void processFile(final File file) {
    FileReader filereader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(filereader);
    bufferedReader.readLine();// try-catch omitted
    final CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';');
    CSVParser parser = new CSVParser(bufferedReader, format);
    final List<CSVRecord> records = parser.getRecords();
    //stuff
}
person Arnaud    schedule 24.08.2017
comment
В случае моего файла csv, разделенного на ,, мне нужно изменить CSVFormat.DEFAULT.withDelimiter(';'); на CSVFormat.DEFAULT.withDelimiter(',');. Это верно? - person mannedear; 30.07.2018

Правильный способ пропустить первую строку, если это заголовок, — использовать другой CSVFormat

CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';').withFirstRecordAsHeader();
person Hitham S. AlQadheeb    schedule 14.08.2018
comment
+1 для withFirstRecordAsHeader(), я использую его с CSVParser, и он пропускает заголовок при повторении парсера. - person keni; 21.08.2018
comment
Это должен быть принятый ответ, поскольку он использует библиотеку вместо специального решения для чистой Java. - person jmm; 28.11.2019

Вы можете пропустить первую запись, используя поток:

List<CSVRecord> noHeadersLine = records.stream.skip(1).collect(toList());
person Frank Why    schedule 23.07.2019

Вы можете отфильтровать его с помощью Java Streams:

parser.getRecords().stream()
     .filter(record -> record.getRecordNumber() != 1) 
     .collect(Collectors.toList());
person Musab Qamri    schedule 30.08.2018
comment
Можете ли вы объяснить свой код? Для чего нужен этот csvRecordToPayerCodeMapping? - person Nico Haase; 30.08.2018
comment
Извините, это для внутреннего использования, вы можете пропустить .map(). Буду редактировать так же - person Musab Qamri; 14.09.2018

Вы можете использовать первую строку, а затем передать ее в CSVParser. Кроме этого, есть метод #withIgnoreEmptyLines, что может решить проблему.

person Murat Karagöz    schedule 24.08.2017
comment
проблема в том, что строка не пуста. Но использование BufferedReader (у которого есть метод readLine) решило эту проблему. - person Medusa; 24.08.2017