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

