Java读取CSV文件报错,移除Synopsis列运行正常问题排查
问题原因与解决方案
根因分析
你当前遇到的报错本质是手动按逗号分割解析CSV的逻辑不支持标准CSV的特殊字段规则,Synopsis(剧情简介)列的内容触发了边界case,具体原因如下:
标准CSV格式允许字段内包含逗号、换行符、双引号,这类字段会用双引号包裹做区分。而你直接使用line.split(",")做分割,完全没有处理这类特殊情况:
- 若Synopsis列的内容里自带逗号,会被误判为列分隔符,导致一行数据被拆分出多于实际列数的数组元素,列索引对应关系完全错乱
- 若Synopsis列的内容里自带换行符,
BufferedReader.readLine()会把换行符识别为行结束标记,将原本完整的一行数据拆分为多行读取。拆分出来的不完整行大多没有逗号,split(",")后得到的数组长度只有1,你尝试访问索引3的元素时就会抛出数组越界异常。
解决方案
推荐方案(优先选择)
不要手动实现CSV解析逻辑,直接使用成熟的第三方CSV解析库,比如OpenCSV、Apache Commons CSV,这类库已经原生适配了所有标准CSV的边界规则,无需自己处理特殊字符。
以下是OpenCSV的使用示例:
// 引入OpenCSV依赖(Maven示例) // <dependency> // <groupId>com.opencsv</groupId> // <artifactId>opencsv</artifactId> // <version>5.6</version> // </dependency> import com.opencsv.CSVReader; import java.io.FileReader; import java.util.List; private void animeList() throws IOException { File file = new File("resources/CSVFiles/animeProjectData.csv"); try (CSVReader reader = new CSVReader(new FileReader(file))) { List<String[]> list = reader.readAll(); System.out.println(list.get(2)[3]); } }
手动实现方案(不推荐)
如果必须自己实现解析逻辑,需要额外处理双引号包裹的字段:读取内容时如果遇到双引号开头的字段,要持续读取直到匹配到闭合的双引号,中间的逗号、换行都要识别为字段内容,不能作为分隔符或行结束标记。
内容的提问来源于stack exchange,提问作者Joeystandard
相关产品推荐
相关产品推荐

