2016-04-12 31 views
9

我想使用clojure从文件中读取前n行。这里是我的代码:如何在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) 

我不知道为什么我有这样的错误。

+0

'test.txt'包含20多行吗? – ClasG

+0

你可以添加需求到你的问题?我喜欢能够将粘贴代码复制到REPL中:(需要'[clojure.java.io:参考[reader]]) –

回答

18

由于您在同一个阅读器上多次呼叫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行,这只会打印文件中的所有行。

+0

您可以将需求添加到您的答案中吗?我喜欢能够复制粘贴代码到REPL (需要'[clojure.java.io:参考[reader]]) –

+1

@MichielBorkent当然;我只是想反映OP的风格。我添加了一个带有别名的'require',因为在可行的情况下,我更喜欢在':refer'之上使用':as'。 –

相关问题