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

Java读取CSV文件并将数据存入List的问题排查与调试

问题分析与解决方案

首先看你代码里的几个明显问题,导致只输出了[32]:

1. 文件路径错误

你写的路径是"\\C:\\Users\\Book1.csv\\",末尾多了一个反斜杠,这会让Java把它当成目录而不是文件,而且开头的反斜杠完全多余。正确的路径写法应该是:

new File("C:\\Users\\Book1.csv")
// 或者用跨平台友好的正斜杠写法
new File("C:/Users/Book1.csv")

2. 分隔符未处理逗号后的空格

你的CSV数据格式是Data, 32, 4.3 Month, May2, May 5,逗号后面跟着空格,但你只设置了分隔符为,,这样scanner.next()会拿到带前导空格的内容(比如" 32")。虽然这不是只输出32的直接原因,但会导致数据不干净,建议把分隔符改成匹配逗号和后续任意空格:

scanner.useDelimiter(",\\s*");

3. 循环索引越界导致程序提前终止

你在while(scanner.hasNext())内部嵌套的for循环有致命错误:

for (int i = 0; i <= myList.size(); i++) {
    System.out.println(myLis...

List的索引范围是0到size()-1,i <= myList.size()会触发IndexOutOfBoundsException,程序直接崩溃,所以只来得及输出部分内容。而且这个循环的位置也不对——每次添加一个元素就遍历打印,会重复输出之前的内容,应该把打印逻辑放到所有数据读取完成后。


修复后的完整原生Java代码

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class CsvReader {
    public static void main(String[] args) {
        ArrayList<String> myList = new ArrayList<>();
        try {
            // 修复文件路径
            Scanner scanner = new Scanner(new File("C:\\Users\\Book1.csv"));
            // 匹配逗号及后续任意空格,处理CSV中的空格分隔
            scanner.useDelimiter(",\\s*");
            
            while (scanner.hasNext()) {
                // 再trim一次确保没有首尾冗余空格
                String item = scanner.next().trim();
                myList.add(item);
            }
            scanner.close();
            
            // 所有数据读取完成后统一打印
            System.out.println("读取到的所有数据:");
            for (String item : myList) {
                System.out.println(item);
            }
            // 或者直接打印整个List
            System.out.println(myList);
            
        } catch (FileNotFoundException e) {
            // 增加异常处理,避免程序静默崩溃
            System.out.println("找不到指定的CSV文件:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

更稳健的CSV读取方案(推荐)

原生Scanner处理CSV有局限性,如果你的CSV字段包含逗号(比如"Doe, John", 25)、换行等复杂格式,Scanner的分隔符方式会直接失效。这种情况下建议使用专门的CSV库,比如Apache Commons CSV或OpenCSV。

举个Apache Commons CSV的简单示例:

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;

import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class CommonsCsvReader {
    public static void main(String[] args) {
        List<String> allData = new ArrayList<>();
        try (FileReader reader = new FileReader("C:\\Users\\Book1.csv");
             CSVParser parser = CSVFormat.DEFAULT.parse(reader)) {
            
            for (CSVRecord record : parser) {
                // 遍历每行的所有字段
                for (String field : record) {
                    allData.add(field.trim());
                }
            }
            
            System.out.println(allData);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这种方式能正确处理带特殊字符的字段、多行字段等复杂场景,比原生Scanner靠谱得多。


内容的提问来源于stack exchange,提问作者val

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:34:42