Clojure逐行读取大XML文件并赋值变量报错求助
解决Clojure读取大文件并赋值变量的问题
首先,咱们来拆解你遇到的“未解析符号”错误根源:你把注释和代码挤在了同一行,用单行注释;;之后,后面的with-open代码直接被当成注释忽略了!这就导致str1根本没被赋值,自然会报错。
先给你修正后的代码,咱们一步步来:
第一步:正确读取大文件并赋值变量
首先要引入clojure.java.io命名空间,然后修正函数的语法问题:
; 先引入IO工具包 (require '[clojure.java.io :as io]) (defn read-file [] (let [str1 ; 这个变量会存储文件的所有行(以向量形式) (with-open [rdr (io/reader "resources/loremipsum.txt")] ; line-seq是惰性序列,逐行读取,不会一次性加载整个大文件 ; reduce conj [] 把惰性序列转换成便于后续使用的向量 (reduce conj [] (line-seq rdr)))] str1)) ; 返回变量内容 ; 调用函数,把结果赋值给全局变量,方便后续处理 (def file-contents (read-file))
关键细节说明:
with-open是必须的:它会自动帮你关闭文件读取器,避免资源泄漏,处理文件时一定要用这个。line-seq适合大文件:它是惰性的,每次只读取一行到内存,完美解决大文件不能用slurp的问题。- 如果你不需要把所有行都存在内存里(比如要逐行处理后直接写入),可以去掉
reduce conj [],直接遍历line-seq,下面给你补充这个场景的代码。
第二步:补充逐行处理并写入文件的示例(贴合你后续需求)
既然你最终要逐行处理后写入选定内容,这里给你一个更贴合需求的例子,全程低内存占用:
(require '[clojure.java.io :as io]) (require '[clojure.string :as str]) (defn process-and-write [] (with-open [rdr (io/reader "resources/loremipsum.txt") wtr (io/writer "resources/selected-content.txt")] ; 逐行遍历文件内容 (doseq [line (line-seq rdr)] ; 这里写你的筛选逻辑,比如只保留包含"ipsum"的行 (when (str/includes? line "ipsum") ; 写入文件时要手动加换行符,因为line-seq返回的行不带换行 (.write wtr (str line "\n")))))) ; 调用函数执行处理 (process-and-write)
这样处理超大文件时,内存里永远只有当前处理的一行,性能拉满。
现在你再运行修正后的read-file函数,就能成功把文件内容赋值给变量了,不会再出现“未解析符号”的错误啦。
内容的提问来源于stack exchange,提问作者alistair33
相关产品推荐
相关产品推荐

