如何防止剧集角色重复创建及解决OpenCSV解析CSV末尾行异常问题
错误原因
该报错不是代码读取到文件末尾不知道终止,而是CSV文件本身存在格式问题:要么是文件末尾残留了多余的空行,要么是最后一行有效数据存在未闭合的双引号,opencsv解析时会把末尾的无效内容识别为第1036行,因此抛出未终止引用字段的异常。
解决方法
方案1:修复CSV源文件(优先选择)
- 打开CSV文件拉到最底部,删除所有多余的空行、尾部空白字符
- 检查最后一行(1035行)的所有字段,确保双引号都是成对闭合的
- 如果该CSV是其他程序生成的,调整生成逻辑,避免输出格式错误的行和末尾空行
方案2:代码兼容异常格式
如果不能修改源文件,给opencsv增加容错配置即可,修改解析部分代码如下:
// 先导入需要的类 import com.opencsv.bean.CsvToBean; import com.opencsv.exceptions.CsvException; // 修改解析逻辑 CsvToBean<Character> csvToBean = new CsvToBeanBuilder<Character>(new FileReader(file)) .withType(Character.class) .withSkipLines(1) // 过滤空行 .withFilter(line -> { if (line == null || line.length == 0) return false; return !String.join("", line).isBlank(); }) // 关闭解析异常抛出,遇到错误行自动跳过 .withThrowExceptions(false) .build(); List<Character> characters = csvToBean.parse(); // 可选:打印错误行信息方便排查 List<CsvException> parseErrors = csvToBean.getCapturedExceptions(); if (!parseErrors.isEmpty()) { System.out.printf("共跳过%d条格式错误的行%n", parseErrors.size()); }
额外优化建议
你当前的写入逻辑是全量覆盖整个CSV文件,数据量较大时性能损耗很高,后续可以调整为直接向文件末尾追加新行,不需要重写所有已有数据,运行效率会明显提升。
内容的提问来源于stack exchange,提问作者RedRum
相关产品推荐
相关产品推荐

