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

如何使用Scanner从混合内容文件中提取纯字符串并写入新文件

解决方法:修正纯字符串判断逻辑

我来帮你搞定这个问题!你当前的esString方法完全起不到过滤作用——因为任何String对象调用toString()返回的都是它本身,所以这个判断永远会返回true,根本没法区分纯字符串和数字类内容。

核心思路

我们需要反过来判断:如果一个字符串无法被解析为整数或浮点数,那它就是我们要保留的纯字符串。可以通过异常捕获的方式实现这个判断——尝试把字符串解析为数字,成功则说明是数字(过滤),失败则说明是纯字符串(保留)。

修正后的完整代码

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Locale;
import java.util.Scanner;
import java.io.PrintWriter;

public class StringExtractor {
    public static void buscarFichero(String ftx) {
        File f = new File(ftx);
        Scanner s = null;
        PrintWriter p = null;
        try {
            s = new Scanner(f).useLocale(Locale.US);
            p = new PrintWriter(ftx + "_nuevo");
            while (s.hasNextLine()) {
                String aux = s.nextLine();
                if (esString(aux)) { // 简化判断写法,无需==true
                    String b = aux.trim();
                    p.println(b);
                }
            }
        } catch (FileNotFoundException e) {
            // 添加异常打印,方便调试文件找不到的问题
            e.printStackTrace();
        } finally {
            if (s != null) {
                s.close();
            }
            if (p != null) {
                p.close();
            }
        }
    }

    public static boolean esString(String x) {
        String trimmedStr = x.trim();
        // 处理空白行:若不需要保留空行则返回false,需要则返回true
        if (trimmedStr.isEmpty()) {
            return false;
        }
        // 尝试解析为整数
        try {
            Integer.parseInt(trimmedStr);
            return false;
        } catch (NumberFormatException e) {
            // 整数解析失败,尝试解析浮点数
            try {
                Double.parseDouble(trimmedStr);
                return false;
            } catch (NumberFormatException ex) {
                // 两种数字类型都解析失败,判定为纯字符串
                return true;
            }
        }
    }
}

关键说明

  1. esString方法逻辑:

    • 先对字符串做trim处理,避免空白字符干扰数字解析
    • 先尝试解析整数,失败后再尝试解析浮点数
    • 若两种解析都失败,判定为纯字符串返回true;否则返回false(过滤数字内容)
  2. 额外优化点:

    • 简化了原代码中冗余的if(esString(aux) == true)写法
    • 给异常捕获块添加了打印逻辑,方便排查文件读取异常
  3. 自定义调整:

    • 如果需要保留空白行,只需把trimmedStr.isEmpty()的返回值改为true
    • 对于包含部分数字但非纯数字的内容(比如"abc123"),该方法会正确保留,因为这类字符串无法被解析为纯数字

内容的提问来源于stack exchange,提问作者Daniel López

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:07:51