使用 doseq 读取文件直到 Clojure 中的特定行
Read file until certain line in Clojure using doseq
这在其他语言中通常是微不足道的,但我在 Clojure 中找不到这样的例子。
我可以使用以下方法打印整个文件:
(with-open [rdr (io/reader "file")]
(doseq [line (line-seq rdr) :while (< count(line) 10)]
(println line)))
但是如何让它在第 5 行停止?
谢谢。
你可以试试这个:
(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
returns惰性序列,所以应该在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))))
只需使用take
来限制行数:
替换
(doseq [line (line-seq rdr) ;; ...
与
(doseq [line (take 5 (line-seq rdr)) ;; ...
这在其他语言中通常是微不足道的,但我在 Clojure 中找不到这样的例子。
我可以使用以下方法打印整个文件:
(with-open [rdr (io/reader "file")]
(doseq [line (line-seq rdr) :while (< count(line) 10)]
(println line)))
但是如何让它在第 5 行停止?
谢谢。
你可以试试这个:
(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
returns惰性序列,所以应该在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))))
只需使用take
来限制行数:
替换
(doseq [line (line-seq rdr) ;; ...
与
(doseq [line (take 5 (line-seq rdr)) ;; ...