2016-04-12 12 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

あなたの質問にrequireを追加できますか?私はREPLにペーストコードをコピーできるのが好きです:(require '[clojure.java.io:refer [reader]]) –

答えて

18

line-seqを同じリーダーで複数回呼び出すため、コードで範囲外のエラーが発生します。 test.txtが含まれている場合

(run! println (lines 20 "test.txt")) 

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

(defn lines [n filename] 
    (with-open [rdr (io/reader filename)] 
    (doall (take n (line-seq rdr))))) 

例:あなたは、読者からの行数を取得したい場合は、そのシーケンスからのラインの所望の数を取る、一度だけline-seqを呼び出す必要があります20行未満であれば、これは単にファイル内のすべての行を出力します。

+0

あなたの答えにrequireを追加できますか?私はペーストコードをREPLにコピーできるのが好きです (require '[clojure.java.io:refer [reader]]) –

+1

@MichielBorkent確か;私はちょうどOPのスタイルを鏡にしようとしていた。私はエイリアスで 'require 'を追加しました。実行可能なときに':refer'よりも ':as'を使いたいからです。 –

関連する問題