Apache Commons CSVParser读取时莫名跳过行问题求助
解决Apache Commons CSVParser莫名跳行的问题
我之前也踩过这个坑!你遇到的跳行问题,大概率是因为多次调用了parser.iterator()——这个方法每次调用都会生成一个全新的迭代器实例,而CSVParser是基于流读取的,第一次调用parser.iterator().hasNext()时,迭代器已经开始读取文件内容了,后续再调用parser.iterator()遍历,就会从当前读取位置继续,不是从头开始,自然就会出现“跳过行”的错觉。
先看修正后的核心代码
public static void main(String[] args) { try (File file = new File("myFile.csv"); Reader reader = new BufferedReader(new FileReader(file)); CSVParser parser = CSVParser.parse(reader, CSVFormat.DEFAULT.withDelimiter(';'))) { // 只获取一次迭代器,全程复用 Iterator<CSVRecord> iterator = parser.iterator(); // 先判断是否为空 if (!iterator.hasNext()) { throw new RuntimeException("The file contains no valid records"); } // 用同一个迭代器遍历所有行 while (iterator.hasNext()) { CSVRecord record = iterator.next(); // 这里处理你的业务逻辑,比如获取第一列数据 String firstColumn = record.get(0); System.out.println(firstColumn); } } catch (IOException e) { e.printStackTrace(); } }
其他可能导致跳行的原因排查
除了迭代器复用问题,还有几个常见场景会让你误以为是“跳行”:
- 空白行干扰:如果CSV里有空行,可以在CSVFormat里添加
.withIgnoreEmptyLines(true)来自动跳过空行,同时用.withTrim()去除字段前后的多余空格 - 字段格式不规范:如果某个字段里包含分号
;但没被双引号包裹,解析器会把它当成分隔符,导致行结构被拆乱,看起来像是跳行。这时候要检查CSV文件格式,或者通过CSVFormat配置自定义引号/转义字符 - 编码不匹配:如果文件是UTF-8带BOM或者其他非系统默认编码,读取时会出现异常字符,导致解析错误。可以指定编码读取,比如替换
FileReader为new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)
内容的提问来源于stack exchange,提问作者Sebastien
相关产品推荐
相关产品推荐

