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

Java 8如何将CSV值用作构造方法参数及解决InputMismatchException

解决Scanner读取CSV时的InputMismatchException问题

嘿,我完全懂你遇到的这个坑!用Scanner读CSV默认会踩分隔符的雷,我来给你几个实用的解决方案:

问题根源

Scanner默认把空白字符(空格、换行、制表符)当成分隔符,但CSV是用逗号分隔字段的。这就导致它会把整行(包括逗号)当成一个字符串读,当你用nextInt()这类方法去读时,自然就抛出InputMismatchException了。


方案1:直接修改Scanner的分隔符(最简单的场景)

你不需要转成行处理,直接给Scanner指定正确的分隔符就行!用useDelimiter()方法把分隔符改成逗号,甚至可以同时处理换行:

Scanner scanner = new Scanner(new File("your_file.csv"));
// 兼容逗号分隔,同时处理Windows(\r\n)和Unix(\n)的换行
scanner.useDelimiter(",|\\r?\\n");

while (scanner.hasNext()) {
    // 按顺序读取每个字段
    String username = scanner.next();
    int userAge = scanner.nextInt();
    String email = scanner.next();
    
    // 这里创建你的对象
    User user = new User(username, userAge, email);
}

scanner.close();

⚠️ 注意:这个方法只适合无特殊格式的简单CSV——如果你的字段里包含逗号(比如带引号的"Smith, John"),这种简单的分隔符处理会把引号里的逗号也当成分隔符,就会出错。


方案2:逐行读取再拆分(灵活处理普通CSV)

如果你的CSV有一些小复杂,但还没到需要专业库的程度,逐行读取后拆分是个不错的选择:

Scanner scanner = new Scanner(new File("your_file.csv"));
// 跳过表头(如果有的话)
scanner.nextLine();

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    // 按逗号拆分每行成字段数组
    String[] fields = line.split(",");
    
    // 转换字段类型并创建对象
    String productName = fields[0];
    double price = Double.parseDouble(fields[1]);
    int stock = Integer.parseInt(fields[2]);
    
    Product product = new Product(productName, price, stock);
}

scanner.close();

如果遇到带引号的字段,可以用更智能的正则拆分(忽略引号内的逗号):

String[] fields = line.split(",(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)");

方案3:用专业CSV库(推荐处理复杂CSV)

如果你的CSV涉及带换行的字段、转义字符、引号嵌套这些复杂情况,手动处理会非常麻烦,不如直接用成熟的CSV解析库:

  • OpenCSV
  • Apache Commons CSV

举个OpenCSV的例子(需要先引入依赖):

CSVReader reader = new CSVReader(new FileReader("your_file.csv"));
String[] nextLine;

// 跳过表头
reader.readNext();

while ((nextLine = reader.readNext()) != null) {
    // nextLine自动处理了所有CSV格式问题,直接拿字段用就行
    String orderId = nextLine[0];
    String customerName = nextLine[1];
    LocalDate orderDate = LocalDate.parse(nextLine[2]);
    
    Order order = new Order(orderId, customerName, orderDate);
}

reader.close();

专业库会帮你搞定所有边缘情况,代码更简洁可靠。


总结一下:不是必须把文件行转换处理,修改Scanner分隔符就能解决简单场景;但如果CSV格式复杂,逐行拆分或用专业库会更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:05:22