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
相关产品推荐
相关产品推荐

