File io 将文件读入列表,每个元素表示文件的一行

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

在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 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是我要找的键。我需要一个完整/可用的列表,在打开和关闭文件之后。