这在其他语言中通常是微不足道的,但我在Clojure中找不到这样的例子。
我可以使用以下方式打印整个文件:
(with-open [rdr (io/reader "file")]
(doseq [line (line-seq rdr) :while (< count(line) 10)]
(println line)))
但是如何让它停在第5行?
感谢。
答案 0 :(得分:7)
你可以试试这个:
(println
(with-open [rdr (clojure.java.io/reader "file")]
(let [ls (line-seq rdr)]
(doall (take 5 ls)))))
这将打印指定文件的前5行。
如果您需要跳过一些不满足条件的行,您可以添加filter
。以下代码将打印长度小于10的前五行。
(println
(with-open [rdr (clojure.java.io/reader "file")]
(let [ls (line-seq rdr)]
(->> ls
(filter #(< (count %) 10))
(take 5)
(doall)))))
由于filter
和take
会返回延迟序列,因此应在with-open
形式内实现。在with-open
表单之外,序列无法实现并导致异常。
println
函数也使序列实现,你可以像这样修改代码:
(with-open [rdr (clojure.java.io/reader "data/base_exp.txt")]
(let [ls (line-seq rdr)]
(->> ls
(filter #(> (count %) 10))
(take 5)
(println))))
答案 1 :(得分:6)