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

Java读取CSV文件时如何处理格式特殊的最后一行(单独q)

问题分析与解决方案

你的程序挂起主要是两个关键问题导致的:Scanner分隔符未兼容所有换行格式,以及固定字段数的读取逻辑不够健壮。我来帮你一步步解决:

问题根源

  1. 换行符处理不全:你设置的分隔符是,|\\\\n,但Windows系统的换行是\r\n(回车+换行),这里的\r没有被当作分隔符,会被当成普通字符读取。当程序读到第四行末尾的\r时,会把它当作一个字段值,然后尝试继续读取后面的5个字段——但此时已经没有内容了,Scanner就会一直等待输入,导致程序挂起。
  2. 字段读取逻辑僵化:你的代码默认除了最后一行的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();
    }
}

代码说明

  1. 按行读取:用scnr.nextLine()读取完整的一行,天然兼容\n和\r\n的换行格式,不会出现残留字符的问题。
  2. 终止逻辑清晰:直接判断整行是否是q,符合你的终止需求,不会出现误判。
  3. 灵活的字段处理:用split(",")把每行分割成字段数组,避免了固定字段数导致的阻塞,也能更方便地处理异常行。
  4. 高效输出:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:32:34