Вы можете использовать line-seq
.Быстрый пример:
(ns your.project
(:require [clojure.java.io :as io]))
(defn count-lines [filename]
(with-open [rdr (io/reader filename)]
(count (line-seq rdr))))
Обратите внимание, что line-seq
это lazy .Вы должны быть осторожны, чтобы не использовать последовательность после , когда считыватель закрыт.Следующее не будет работать:
(def lines (with-open [rdr (io/reader "some-file")]
(line-seq rdr)))
(println (first lines))
Первый пример работает, потому что count
не ленив.
Если вы хотите что-то сделать (с побочными эффектами) со строками, которые вы 'Возможно, вы найдете doseq
наиболее полезными:
;; 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))))