首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure :逐行读取edn文件

Clojure :逐行读取edn文件
EN

Stack Overflow用户
提问于 2016-04-14 09:58:29
回答 1查看 2K关注 0票数 3

我在一个文件里写了这样的数据(有点)。

代码语言:javascript
复制
{:a 25 :b 28}
{:a 2 :b 50}
...

我想要这些地图的懒散序列。

大约有4000万条线路。我也可以编写10000块,但我不认为它会改变函数的编写方式(mapcat而不是map)

为了读,我写了

代码语言:javascript
复制
(with-open [affectations (io/reader "dev-resources/affectations.edn")]
  (map read-string affectations))

问题是Clojure告诉我们

代码语言:javascript
复制
Don't know how to create ISeq from : java.io.BufferedReader

老实说,我对java.io名称空间一无所知。我希望文件中有一个懒惰的数据序列,但我不知道如何将流转换为字符串,然后再进行集合。

知道吗?

这是read-line吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-14 10:11:08

您将java.io.BufferedReader传递给map,而map则需要一个seq。

您需要使用line-seq从您的文件中生成一个(懒散的) seq行:

代码语言:javascript
复制
(with-open [affectations (io/reader "dev-resources/affectations.edn")]
  (map read-string (lazy-seq affectations)))

请记住,您需要强制对在with-open范围内打开的资源读取的数据产生所有副作用,否则会出现错误。

一种选择是强制从您的文件中提取全部文本行并使用doall返回它。但是,这个解决方案可以将所有数据读入内存,这似乎不太实际。

我想您需要对文件中的每一行执行一些逻辑,并且不需要将所有已解析的集合保存在内存中。在这种情况下,可以将表示该逻辑的函数传递到处理读取文件的函数中:

代码语言:javascript
复制
(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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36619666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档