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

时间:2017-08-24 12:35:33

标签: java csv apache-commons-csv

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

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

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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