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

Java读取CSV坐标数据时遇到错误行如何自动跳过并继续处理

原有代码的问题

  • 条件判断写为赋值操作:if(isCorrectCSVdata = true) 中是单等号赋值,不是双等号等值判断,该条件永远为true,错误行也会被加入结果集
  • 变量作用域不合理:scanData 定义在循环外部,当前行解析失败时,会把上一次解析成功的对象重复加入列表
  • 标记位逻辑冗余:不需要额外维护校验标记位,解析成功直接加入结果集即可简化逻辑

修正后代码

private static ArrayList<ScanDataObject> getCsvData(String pathToCsv) {
    ArrayList<ScanDataObject> csvDataArray = new ArrayList<>();

    // 提前校验空路径直接返回
    if (pathToCsv == null || pathToCsv.trim().isEmpty()) {
        return csvDataArray;
    }

    try (Scanner scanner = new Scanner(new File(pathToCsv))) {
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            // 跳过空行
            if (line.trim().isEmpty()) {
                continue;
            }
            String[] splits = line.split(";");
            // 提前判断字段数量是否符合要求,避免数组越界
            if (splits.length < 7) {
                continue;
            }

            try {
                String dateTime = splits[0];
                double xAxis = Double.parseDouble(splits[1].replace(',', '.'));
                double yAxis = Double.parseDouble(splits[2].replace(',', '.'));
                double zAxis = Double.parseDouble(splits[3].replace(',', '.'));
                double distance = Double.parseDouble(splits[4].replace(',', '.'));
                double xAxisRover = Double.parseDouble(splits[5].replace(',', '.'));
                double yAxisRover = Double.parseDouble(splits[6].replace(',', '.'));

                // 解析成功才创建对象加入结果集
                ScanDataObject scanData = new ScanDataObject(dateTime, xAxis, yAxis, zAxis, distance, xAxisRover, yAxisRover);
                csvDataArray.add(scanData);
            } catch (Exception e) {
                // 解析失败打印日志后直接跳过当前行
                e.printStackTrace();
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    return csvDataArray;
}

核心优化点

  • 提前校验路径合法性,空路径直接返回空列表
  • 增加空行跳过、字段数量校验逻辑,提前拦截明显的错误行
  • 把scanData的定义移到try块内部,仅解析成功才会创建对象并加入结果集,避免脏数据
  • 去掉冗余的校验标记位,解析失败直接走catch逻辑跳过,无需额外判断
  • 把hasNext()替换为hasNextLine()更贴合按行读取的业务逻辑

内容的提问来源于stack exchange,提问作者Rapido

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 14:09:00