如何跳过 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。
我想跳过第一行并将第二行用作 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。