File io 将文件读入列表,每个元素表示文件的一行
在clojure中,如何将文件读入一个序列,其中每行是序列中的一个元素。因此,我希望看到函数File io 将文件读入列表,每个元素表示文件的一行,file-io,clojure,File Io,Clojure,在clojure中,如何将文件读入一个序列,其中每行是序列中的一个元素。因此,我希望看到函数get line的定义,以便执行以下操作: (def lines (get-lines "test.txt")) 行是一个非惰性序列。您可以使用。一个简单的例子: (ns your.project (:require [clojure.java.io :as io])) (defn count-lines [filename] (with-open [rdr (io/reader filena
get line
的定义,以便执行以下操作:
(def lines (get-lines "test.txt"))
行是一个非惰性序列。您可以使用。一个简单的例子:
(ns your.project
(:require [clojure.java.io :as io]))
(defn count-lines [filename]
(with-open [rdr (io/reader filename)]
(count (line-seq rdr))))
请注意,行seq
是。您必须小心不要在读卡器关闭后使用序列。以下操作将不起作用:
(def lines (with-open [rdr (io/reader "some-file")]
(line-seq rdr)))
(println (first lines))
第一个示例之所以有效,是因为count
并不懒惰
如果你想用这些线条做些什么(有副作用),你可能会发现它们最有用:
;; copy every "short" line in file
(with-open [rdr (io/reader from)
wrt (io/writer to)]
(binding [*out* wrt]
(doseq [line (line-seq rdr) :when (< (count line) 10)]
(println line))))
;;复制文件中的每个“短”行
(打开时[rdr(io/读卡器来自)
wrt(io/编写人至)]
(绑定[*out*wrt]
(doseq[行(行顺序rdr):何时(<(计数行)10)]
(打印行)
要将惰性序列转换为非惰性序列,您可以像这样使用doall
:
(use 'clojure.java.io)
(defn get-lines [fname]
(with-open [r (reader fname)]
(doall (line-seq r))))
替代实施:
(require ['clojure.string :as 'str])
(defn get-lines [file]
(str/split-lines (slurp file)))
此函数返回结果的向量,而不是seq
如果您不使用1.3,请改为要求clojure.contrib.string。doall是我要找的键。我需要一个完整/可用的列表,在打开和关闭文件之后。