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

如何在Java中跳过csv的第一行?,java,csv,apache-commons-csv,Java,Csv,Apache Commons Csv,我想跳过第一行,用第二行作为标题 我使用ApacheCommonsCSV中的类来处理csv文件 CSV文件的标题位于第二行,而不是第一行(包含坐标) 我的代码如下所示: static void processFile(final File file) { FileReader filereader = new FileReader(file); final CSVFormat format = CSVFormat.DEFAULT.withDelimiter(';'); C

我想跳过第一行,用第二行作为标题

我使用ApacheCommonsCSV中的类来处理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
}
这将解决问题,因为它与FirstRowAsHeader不同,我认为它将检测到第一行不包含任何分号,并且不是记录。没有。我试图跳过第一行(CSVFormat似乎认为是标题)


但这也不起作用。我能做什么?使用FirstRowAsHeader和使用FirstRecordAsHeader有什么区别?

在将读卡器传递给
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
}
静态void进程文件(最终文件){
FileReader FileReader=新的FileReader(文件);
BufferedReader BufferedReader=新的BufferedReader(文件阅读器);
bufferedReader.readLine();//省略try catch
final CSVFormat format=CSVFormat.DEFAULT.withDelimiter(“;”);
CSVParser parser=新的CSVParser(bufferedReader,格式);
最终列表记录=parser.getRecords();
//东西
}

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

如果第一行是标题,则跳过它的正确方法是使用不同的
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());
List noHeadersLine=records.stream.skip(1.collect)(toList());

在将fileReader交给解析器之前,您是否尝试过一直读到换行符?问题是该行不是空的。但是使用BufferedReader(它有一个readLine方法)解决了这个问题。对于我的
单独的csv文件,我需要更改
CSVFormat.DEFAULT.withDelimiter(“;”)
to
CSVFormat.DEFAULT.withDelimiter(',')。这是正确的吗?+1对于withFirstRecordAsHeader(),我将其与CSVParser一起使用,当您迭代解析器时,它将跳过标题。这应该是可以接受的答案,因为它使用库,而不是特殊的纯Java解决方案。您能解释一下您的代码吗?那是什么
csvRecordToPayerCodeMapping
需要的?对不起,这是内部使用的,您可以跳过.map()。将编辑相同的内容
parser.getRecords().stream()
     .filter(record -> record.getRecordNumber() != 1) 
     .collect(Collectors.toList());
List<CSVRecord> noHeadersLine = records.stream.skip(1).collect(toList());