Java读取CSV文件时如何处理格式特殊的最后一行(单独q)
问题分析与解决方案
你的程序挂起主要是两个关键问题导致的:Scanner分隔符未兼容所有换行格式,以及固定字段数的读取逻辑不够健壮。我来帮你一步步解决:
问题根源
- 换行符处理不全:你设置的分隔符是
,|\\\\n,但Windows系统的换行是\r\n(回车+换行),这里的\r没有被当作分隔符,会被当成普通字符读取。当程序读到第四行末尾的\r时,会把它当作一个字段值,然后尝试继续读取后面的5个字段——但此时已经没有内容了,Scanner就会一直等待输入,导致程序挂起。 - 字段读取逻辑僵化:你的代码默认除了最后一行的
q,其他每行都必须有6个字段,但直接按分隔符读取的方式没有遵循CSV的"行"结构,一旦遇到格式异常(比如换行符不规范)就会出错。
修复后的代码
改用按行读取的方式处理CSV,这是更符合CSV文件结构的做法,也能彻底避免分隔符的问题:
import java.util.Scanner; public class AccountTester { public static void main(String[] args) { Scanner scnr = new Scanner(System.in); StringBuilder output = new StringBuilder(); // 用StringBuilder拼接输出更高效 while (scnr.hasNextLine()) { String line = scnr.nextLine().trim(); // 读取一行并去除首尾空白,避免空行干扰 if ("q".equals(line)) { output.append(" q"); break; } // 分割行成字段(如果你的CSV字段包含逗号,需要更复杂的解析,但示例中无此情况) String[] fields = line.split(","); // 确保字段数正确,避免数组越界 if (fields.length == 6) { for (String field : fields) { output.append(" ").append(field); } } } // 输出结果(去掉开头多余的空格) System.out.println(output.substring(1)); scnr.close(); } }
代码说明
- 按行读取:用
scnr.nextLine()读取完整的一行,天然兼容\n和\r\n的换行格式,不会出现残留字符的问题。 - 终止逻辑清晰:直接判断整行是否是
q,符合你的终止需求,不会出现误判。 - 灵活的字段处理:用
split(",")把每行分割成字段数组,避免了固定字段数导致的阻塞,也能更方便地处理异常行。 - 高效输出:用
StringBuilder拼接所有内容,最后统一输出,比多次调用System.out.print更高效。
测试结果
用你提供的CSV内容输入,程序会输出预期结果:
u ADMHops ADM Grace Hopper 12498 P@55w0Rd 8 u average-joe Joe Jones 12377 123 3 b Googlebot searchEngine Sergey Brin 12345678 2 b cw1noonbot malicious Some Rascal asdf1234AAA@@@ 6 q
内容的提问来源于stack exchange,提问作者TimidTomato
相关产品推荐
相关产品推荐

