如何从clojure中的文件中读取n行

Xiu*_* Xu 9 clojure

我想使用clojure从文件中读取前n行.这是我的代码:

(defn read-nth-line [file]
  (with-open [rdr (reader file)]
    (loop [line-number 0]
      (when (< line-number 20)
            (nth (line-seq rdr) line-number)
            (recur (inc line-number))))))
Run Code Online (Sandbox Code Playgroud)

但是当我跑

 user=> (read-nth-line "test.txt")

 IndexOutOfBoundsException   clojure.lang.RT.nthFrom (RT.java:871)
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会出现这样的错误.

Sam*_*tep 19

您的代码会产生越界错误,因为您line-seq在同一个阅读器上多次调用.如果你想从阅读器获得一些行,你应该line-seq只调用一次,然后从该序列中获取所需的行数:

(require '[clojure.java.io :as io])

(defn lines [n filename]
  (with-open [rdr (io/reader filename)]
    (doall (take n (line-seq rdr)))))
Run Code Online (Sandbox Code Playgroud)

例:

(run! println (lines 20 "test.txt"))
Run Code Online (Sandbox Code Playgroud)

如果test.txt包含少于20行,则只打印文件中的所有行.