You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:27:04