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
相关产品推荐
相关产品推荐

