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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 04:54:03