web-dev-qa-db-ja.com

Javaでcsvの最初の行をスキップするにはどうすればよいですか?

最初の行をスキップして、2行目をヘッダーとして使用します。

Apache commons csvのクラスを使用してCSVファイルを処理しています。

CSVファイルのヘッダーは、最初の行(座標を含む)ではなく、2行目にあります。

私のコードは次のようになります:

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の違いは何ですか?

9
Medusa

リーダーを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
}
7
Arnaud

ヘッダーの場合、最初の行をスキップする正しい方法は、別のCSVFormatを使用することです

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

Java Streams:

parser.getRecords().stream()
     .filter(record -> record.getRecordNumber() != 1) 
     .collect(Collectors.toList());
0
Musab Qamri

最初の行を消費し、CSVParserに渡すことができます。それ以外には、問題を解決する可能性のあるメソッド #withIgnoreEmptyLines があります。

0
Murat Karagöz

ストリームを使用して最初のレコードをスキップできます:

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