最初の行をスキップして、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の違いは何ですか?
リーダーを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
}
ヘッダーの場合、最初の行をスキップする正しい方法は、別のCSVFormat
を使用することです
CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';').withFirstRecordAsHeader();
Java Streams:
parser.getRecords().stream()
.filter(record -> record.getRecordNumber() != 1)
.collect(Collectors.toList());
最初の行を消費し、CSVParserに渡すことができます。それ以外には、問題を解決する可能性のあるメソッド #withIgnoreEmptyLines があります。
ストリームを使用して最初のレコードをスキップできます:
List<CSVRecord> noHeadersLine = records.stream.skip(1).collect(toList());