我想跳过第一行并使用第二行作为标题。
我正在使用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之间有什么区别?
答案 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());