到目前为止我有:
(:require [clojure-csv.core :as csv])
(:require [clojure.java.io :as io]))
(def csv-file (.getFile (clojure.java.io/resource "verbs.csv")))
(defn process-csv [file]
(with-open [rdr (io/reader file)]
(csv/parse-csv rdr)))
但我越来越java.io.IOException: Stream closed
。我在用Clojure-csv https://github.com/davidsantiago/clojure-csv它公开了两种方法,我正在使用第一种方法,parse-csv
,医生说:
Takes a CSV as a char sequence or string, and returns a lazy sequence of vectors of strings
我认为我知道的是:with-open
是懒惰的,并且rdr
in (csv/parse-csv rdr)))
csv 文件是单行吗?
附言。我还想搜索该文件,重复打开该文件(即使它正在被懒惰地读取)并搜索整个内容是否昂贵?
with-open
不是懒,而是如果你内心做了一些偷懒的事情with-open
,如果不强制惰性操作在范围内,您可能会遇到问题with-open
。需要做的是在退出之前强制所有惰性结果with-open
block.
(defn process-csv [file]
(with-open [rdr (io/reader file)]
(doall (csv/parse-csv rdr))))
功能doall
旨在确保实现整个惰性序列。
由于输入的大小,另一种可能性是安排自己关闭阅读器,然后将惰性用于其预期目的(仅在需要时生成结果)。
(defn find-results
[stream]
(for [record stream
:while (seq (first record))]
record))
(def rdr (io/reader "verbs.csv"))
(def csv (csv/parse-csv rdr))
(def results (doall (find-results csv)))
(.close rdr)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)