使用 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)))))

由于filtertakereturns惰性序列,所以应该在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)) ;; ...