Java中如何跳过CSV表头前的多余行并按表头读取指定数据
使用Apache Commons CSV跳过前置行读取表头的实现方案
你当前使用的Apache Commons CSV库原生支持跳过文件开头的指定行数,仅需对CSVFormat的配置做少量修改即可满足需求,无需重构原有逻辑。
方案1:前置行数量固定的场景
如果CSV文件表头前的无关行数量是固定的,直接使用CSVFormat提供的withSkipLines()方法即可,该方法会跳过文件开头的N行,将第N+1行识别为表头行。
修改后的代码如下:
public String getSpecificCSVDataUsingHeader(String filePath, String header, int skipLines) { String value = ""; String basePath = new File(filePath).getAbsolutePath(); try ( BufferedReader br = new BufferedReader(new FileReader(basePath)); // 新增withSkipLines配置,skipLines为需要跳过的前置行数量 org.apache.commons.csv.CSVParser parser = CSVFormat.DEFAULT .withDelimiter(',') .withSkipLines(skipLines) .withHeader() .parse(br); ) { for (CSVRecord record : parser) { value = record.get(header); } return value; } catch (IOException e) { LogUtil.error(this, e.getMessage()); } return value; }
调用方法时传入对应需要跳过的行数即可,比如表头前有2行无关内容,就传入skipLines=2。
方案2:前置行数量不固定的场景
如果前置行数量不确定,需要根据内容判断哪一行是表头,可以先手动读取行定位到表头位置,再将BufferedReader传给CSVParser:
public String getSpecificCSVDataUsingHeader(String filePath, String header) { String value = ""; String basePath = new File(filePath).getAbsolutePath(); try (BufferedReader br = new BufferedReader(new FileReader(basePath))) { String line; br.mark(1024 * 1024); // 标记读取位置,方便回退 // 自定义条件判断表头,这里示例判断行是否包含指定表头字段,可根据实际需求修改 while ((line = br.readLine()) != null) { if (line.contains(header)) { // 找到表头后,将当前行重新推回流中,供CSVParser读取作为表头 br.reset(); break; } br.mark(1024 * 1024); } org.apache.commons.csv.CSVParser parser = CSVFormat.DEFAULT .withDelimiter(',') .withHeader() .parse(br); for (CSVRecord record : parser) { value = record.get(header); } return value; } catch (IOException e) { LogUtil.error(this, e.getMessage()); } return value; }
内容的提问来源于stack exchange,提问作者JCALTS ako
相关产品推荐
相关产品推荐

