使用CSVParser读取|分隔TXT提取第18列数据不全及越界问题求助
问题定位与修复方案
核心问题梳理
- 现有校验条件逻辑完全错误:
csvRecord.size()返回的是当前行的字段总数,csvParser.getRecordNumber()返回的是已经解析完成的记录行数,二者没有关联。当前的校验规则要求「当前行字段数≥当前行号」才会提取第18列,比如第1行要≥1个字段、第2行要≥2个字段……直到第19行才会满足≥19的条件,这就是你只能拿到部分匹配数据的原因。 - 数组越界错误的根本原因:Java的索引从0开始计数,要取索引为18的列,要求当前行至少有19个字段。移除错误校验后,代码会处理所有行,一旦遇到字段数不足19的行,调用
csvRecord.get(18)就会触发越界报错。 - 手动跳第一行的实现不规范:直接通过BufferedReader读取首行跳过表头的方式,容易因为IO流状态异常导致CSVParser读取错位,更推荐直接通过CSVFormat配置跳过表头。
修复后代码
public static List<String> murexMHEU_TradeCash() throws Exception { List<String> MHEUList = new ArrayList<String>(); String path = Setup.MHEU_TradeCash; // 配置CSV格式:指定分隔符为|,跳过第一行表头 CSVFormat csvFormat = CSVFormat.DEFAULT.withDelimiter('|').withSkipHeaderRecord(); try (BufferedReader br = new BufferedReader(new FileReader(path)); CSVParser csvParser = new CSVParser(br, csvFormat); ) { for (CSVRecord csvRecord : csvParser) { // 正确校验:判断当前行字段数是否≥19(满足取索引18的要求) if(csvRecord.size() >= 19){ String MurexCounterpartyRef = csvRecord.get(18); MHEUList.add(MurexCounterpartyRef); } // 可选:如果需要定位不符合要求的行,可放开下方逻辑打印日志 /*else { System.out.printf("第%d行字段数不足19,实际为%d,跳过处理%n", csvRecord.getRecordNumber(), csvRecord.size()); }*/ } } catch(IOException e) { System.out.println("文件读取异常 - " + e.getMessage()); } return MHEUList; }
额外注意事项
- 如果你的TXT文件存在转义符、引号包裹字段等特殊情况,可以根据实际情况调整CSVFormat的配置,比如添加
withQuote(null)关闭引号解析,避免字段拆分错误。 - 如果你提到的「第18列」是日常计数规则下的第18列(从1开始数),那对应的索引应该是17,把代码里的18改成17、校验条件改成≥18即可。
内容的提问来源于stack exchange,提问作者Bruno Lorena
相关产品推荐
相关产品推荐

