如何在Clojure中从文件中读取n行

10

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

但是当我运行时

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

 IndexOutOfBoundsException   clojure.lang.RT.nthFrom (RT.java:871)

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


test.txt文件是否包含超过20行? - SamWhan
你能在问题中添加require吗?我喜欢能够将代码复制粘贴到REPL中:(require '[clojure.java.io :refer [reader]]) - Michiel Borkent
1个回答

20

你的代码产生了越界错误,因为你在同一个读取器上多次调用了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! println (lines 20 "test.txt"))
如果 `test.txt` 文件的行数少于 20 行,这将会简单地打印文件中的所有行。

你能在你的回答中添加require吗?我喜欢能够将代码复制粘贴到REPL中。(require '[clojure.java.io :refer [reader]]) - Michiel Borkent
1
@MichielBorkent 当然可以;我只是试图模仿原帖的风格。我添加了一个带有别名的require,因为在可行的情况下,我更喜欢使用:as而不是:refer - Sam Estep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接