如何跳过 Java 中 csv 的第一行?

How can I skip the first line of a csv in Java?

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

我正在使用来自 apache commons csv 的 类 来处理 CSV 文件。

CSV 文件的 header 在第二行,而不是第一行(包含坐标)。

我的代码如下所示:

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 似乎认为是 header)
CSVFormat format = CSVFormat.DEFAULT.withSkipHeaderRecord().withFirstRecordAsHeader().withDelimiter(;);

但这也行不通。我能做什么? withFirstRowAsHeader 和 withFirstRecordAsHeader 有什么区别?

在将 reader 传递给 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
}

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

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

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

您可以使用 Java 流过滤它:

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

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

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

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

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

val parser = CSVParser.parse(reader, format)

我假设您的文件格式类似于:

<garbage line here>
<header data>
<record data starts here>

对于 1.9.0 版,使用上面给出的方法,但增加一个:

Reader in = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(in);
System.out.println(bufferedReader.readLine());
CSVFormat format = CSVFormat.Builder.create(CSVFormat.DEFAULT)
            .setHeader()
            .setSkipHeaderRecord(true)
            .build();
CSVParser parser = CSVParser.parse(bufferedReader, format);
for (CSVRecord record : parser.getRecords()) {
    <do something>
}

如果您不以某种方式跳过第一行,您将抛出 IllegalArgumentException。