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")))))
关键逻辑说明
- 正则替换清理内容:用
str/replace配合正则表达式[^0-9],匹配所有非数字字符并替换为空字符串。这个正则的含义是“除0-9以外的所有字符”,精准满足你的需求。 - 懒加载适配大文件:
line-seq是懒序列,只会在需要时读取下一行,不会把整个超大文件加载到内存,完美解决大文件内存溢出的问题。 - 资源安全保障:
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
相关产品推荐
相关产品推荐

