我在一个文件里写了这样的数据(有点)。
{:a 25 :b 28}
{:a 2 :b 50}
...我想要这些地图的懒散序列。
大约有4000万条线路。我也可以编写10000块,但我不认为它会改变函数的编写方式(mapcat而不是map)
为了读,我写了
(with-open [affectations (io/reader "dev-resources/affectations.edn")]
(map read-string affectations))问题是Clojure告诉我们
Don't know how to create ISeq from : java.io.BufferedReader老实说,我对java.io名称空间一无所知。我希望文件中有一个懒惰的数据序列,但我不知道如何将流转换为字符串,然后再进行集合。
知道吗?
这是read-line吗?
谢谢
发布于 2016-04-14 10:11:08
您将java.io.BufferedReader传递给map,而map则需要一个seq。
您需要使用line-seq从您的文件中生成一个(懒散的) seq行:
(with-open [affectations (io/reader "dev-resources/affectations.edn")]
(map read-string (lazy-seq affectations)))请记住,您需要强制对在with-open范围内打开的资源读取的数据产生所有副作用,否则会出现错误。
一种选择是强制从您的文件中提取全部文本行并使用doall返回它。但是,这个解决方案可以将所有数据读入内存,这似乎不太实际。
我想您需要对文件中的每一行执行一些逻辑,并且不需要将所有已解析的集合保存在内存中。在这种情况下,可以将表示该逻辑的函数传递到处理读取文件的函数中:
(defn process-file [filename process-fn]
(with-open [reader (io/reader filename)]
(doseq [line (line-seq reader)]
(-> line
(read-string)
(process-fn)))))此函数将逐行读取文件,使用read-string逐行转换每个文件,并调用process-fn函数。process-file将返回nil。
https://stackoverflow.com/questions/36619666
复制相似问题