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

Clojure处理超大TXT文件:保留数字并写入新文件技术求助

处理超大TXT文件:仅保留数字字符的Clojure实现

你当前的代码已经搭建好了大文件逐行读写的核心框架(with-open保证资源自动回收、line-seq懒加载避免内存溢出),只需在每行写入前添加清理逻辑即可。这里给你优化后的完整解决方案:

完整代码实现

(ns my.file.processor
  (:require [clojure.java.io :as io]
            [clojure.string :as str])
  (:jvm-opts ["-Xmx2G"]))

(with-open [rdr (io/reader "/Myfile.txt")
            wrt (io/writer "/Myfile2.txt")]
  (doseq [line (line-seq rdr)]
    ;; 移除所有非数字字符,仅保留0-9
    (let [clean-line (str/replace line #"[^0-9]" "")]
      ;; 将清理后的行写入新文件
      (.write wrt (str clean-line "\n")))))

关键逻辑说明

  1. 正则替换清理内容:用str/replace配合正则表达式[^0-9],匹配所有非数字字符并替换为空字符串。这个正则的含义是“除0-9以外的所有字符”,精准满足你的需求。
  2. 懒加载适配大文件:line-seq是懒序列,只会在需要时读取下一行,不会把整个超大文件加载到内存,完美解决大文件内存溢出的问题。
  3. 资源安全保障:with-open会自动关闭读写流,不用担心遗漏关闭文件句柄导致的资源泄漏。

可选优化:过滤空行

如果原文件中有完全不含数字的行,清理后会变成空行。如果你想跳过这些空行,可以修改写入逻辑:

(with-open [rdr (io/reader "/Myfile.txt")
            wrt (io/writer "/Myfile2.txt")]
  (doseq [line (line-seq rdr)]
    (let [clean-line (str/replace line #"[^0-9]" "")]
      ;; 仅当清理后的行非空时才写入
      (when (seq clean-line)
        (.write wrt (str clean-line "\n"))))))

额外注意事项

  • 编码适配:如果你的TXT文件使用了非系统默认编码(比如GBK),可以在io/reader中指定编码:(io/reader "/Myfile.txt" :encoding "GBK"),避免出现乱码问题。
  • 性能说明:这个方案内存占用极低,每行处理完成后就会被垃圾回收,你设置的-Xmx2G完全能应对绝大多数超大文件场景。

内容的提问来源于stack exchange,提问作者J.Titor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:39:57