12

我想跳过第一行并将第二行用作标题。

我正在使用 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 有什么区别?

4

6 回答 6

24

如果它是标题,则跳过第一行的正确方法是使用不同的CSVFormat

CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';').withFirstRecordAsHeader();
于 2018-08-14T14:09:14.787 回答
11

在将阅读器传递给之前,您可能需要阅读第一行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
}
于 2017-08-24T12:41:29.013 回答
4

在 org.apache.commons:commons-csv 的 1.9.0 版中,使用:

val format = CSVFormat.Builder.create(CSVFormat.DEFAULT)
        .setHeader()
        .setSkipHeaderRecord(true)
        .build()

val parser = CSVParser.parse(reader, format)
于 2021-09-10T10:09:52.457 回答
2

您可以使用流跳过第一条记录:

List<CSVRecord> noHeadersLine = records.stream.skip(1).collect(toList());
于 2019-07-23T06:59:02.223 回答
1

您可以使用 Java Streams 对其进行过滤:

parser.getRecords().stream()
     .filter(record -> record.getRecordNumber() != 1) 
     .collect(Collectors.toList());
于 2018-08-30T10:13:52.770 回答
0

您可以使用第一行,然后将其传递给 CSVParser。除此之外,还有一种方法#withIgnoreEmptyLines可以解决这个问题。

于 2017-08-24T12:42:09.783 回答