使用doseq读取文件,直到Clojure中的某一行

使用doseq读取文件,直到Clojure中的某一行,clojure,Clojure,这在其他语言中通常是微不足道的,但我在Clojure中没有发现这样的例子 我可以使用以下命令打印整个文件: (with-open [rdr (io/reader "file")] (doseq [line (line-seq rdr) :while (< count(line) 10)] (println line))) (打开[rdr(io/reader“文件”)] (doseq[行(行顺序rdr):while(

这在其他语言中通常是微不足道的,但我在Clojure中没有发现这样的例子

我可以使用以下命令打印整个文件:

(with-open [rdr (io/reader "file")]
          (doseq [line (line-seq rdr) :while (< count(line) 10)]
            (println line)))
(打开[rdr(io/reader“文件”)]
(doseq[行(行顺序rdr):while(
但是我怎样才能让它停在5号线呢

谢谢。

你可以试试这个:

(println
 (with-open [rdr (clojure.java.io/reader "file")]
   (let [ls (line-seq rdr)]
     (doall (take 5 ls)))))
这将打印指定文件的前5行

如果需要跳过一些不满足条件的行,可以添加
过滤器
。以下代码将打印长度小于10的前五行

(println
 (with-open [rdr (clojure.java.io/reader "file")]
   (let [ls (line-seq rdr)]
     (->> ls
          (filter #(< (count %) 10))
          (take 5)
          (doall)))))
只需使用以限制行数:

替换

   (doseq [line (line-seq rdr) ;; ...


这可能有助于未来的读者解释为什么需要
doall
。第二个示例并没有在第5行停止阅读。相反,它在第五行以少于10个字符停止读取。
doall
是必需的,因为
take
返回一个惰性序列。部分描述没有我预期的那么清晰。我更新了帖子。你应该把括号移到
行之前的一个符号的左边。
   (doseq [line (line-seq rdr) ;; ...
   (doseq [line (take 5 (line-seq rdr)) ;; ...