您可以使用read-string http://clojuredocs.org/clojure_core/clojure.core/read-string, and slurp http://clojuredocs.org/clojure_core/clojure.core/slurp,从文件中提取记录。read-string http://clojuredocs.org/clojure_core/clojure.core/read-string仅限于读取字符串的第一种形式,但是,从您的示例中,您仅将单个形式存储为记录列表。
(defn load-data-from-file [file]
(read-string (slurp file)))
懒惰阅读
如果您需要的不仅仅是第一种形式,或者无法将整个流读入内存,您可以使用read http://clojuredocs.org/clojure_core/clojure.core/read直接,做一个懒惰的读者。
(defn lazy-read
([rdr] (let [eof (Object.)] (lazy-read rdr (read rdr false eof) eof)))
([rdr data eof]
(if (not= eof data)
(cons data (lazy-seq (lazy-read rdr (read rdr false eof) eof))))))
(defn load-all-data [file]
(with-open [rdr (java.io.PushbackReader. (reader file))]
(doall (lazy-read rdr))))
(load-all-data "C:/Platform/Work/test.cdf")
Security
另外,在加载代码时最好提到安全性read-string http://clojuredocs.org/clojure_core/clojure.core/read-string or read http://clojuredocs.org/clojure_core/clojure.core/read。你应该只使用它们可信来源,因为,使用#=
或 Java 构造函数,源代码可以在应用程序内执行任意代码。有关更长的解释,请查看文档read http://clojuredocs.org/clojure_core/clojure.core/read.
Setting *read-eval* http://clojuredocs.org/clojure_core/clojure.core/%2aread-eval%2a to false
可以防止出现此问题,但也会阻止重建样本中的记录。为了避免这个问题,您可以使用clojure.edn/read http://clojure.github.io/clojure/clojure.edn-api.html and clojure.edn/read-string http://clojure.github.io/clojure/clojure.edn-api.html功能,具有读者白名单。
(defn edn-read [eof rdr]
(clojure.edn/read {:eof eof :readers {'BTC.pcost.Role map->Role
'BTC.pcost.Member map->Member}}
rdr))
(defn lazy-edn-read
([rdr] (let [eof (Object.)] (lazy-edn-read rdr (edn-read eof rdr) eof)))
([rdr data eof]
(if (not= eof data)
(cons data (lazy-seq (lazy-edn-read rdr (edn-read eof rdr) eof))))))
(defn load-all-data [file]
(with-open [rdr (java.io.PushbackReader. (reader file))]
(doall (take-while (complement nil?) (lazy-edn-read rdr)))))
(load-all-data "C:/Platform/Work/test.cdf")