2016-04-18 4 views
1

ここで私のコードに何が間違っているかを調べようとしています。基本的には、非常に大きなファイルを読んでいて、ファイル内の各行の最後に数字があるという考え方があります。私は最後の数字が500より大きい行の数を数えたいと思っています。クローズドフィルタを含むファイル内の行数をカウントする

私はこれを持っていますが、それはうまくいくはずですが、何かがうまくいかず、何も起こっていません。繰り返しで体(おそらく副作用のために)を実行1.0 に

clojure.core/doseq [配列-は、expr &ボディ] マクロ を追加しました:

(defn countlines [] (with-open [rdr (clojure.java.io/reader "myfile.txt")] 
(doseq [line (line-seq rdr)] 
(count (re-find #"(?!500)[56789]\d{2,}|\d{4,}$" line))))) 
+0

@Elogentおっと、ええ。たとえば、この行は "この行は無駄なもの50123の束です"とその後の行は "この行もかなり役に立たない43" – JCD

答えて

4

理由は、あなたがdoseqを使用することです "for"によって提供されるバインディングとフィルタリング。シーケンスの先頭に を保持しません。 nilを返します。

あなたはおそらく(doall (for [line (line-seq rdr)] ...

のようなものにそれを書き換える必要がありますが、あなたの関数が試合で文字のカウントの配列を返しますので、あなたのタスクを達成するために、あなたは(それを書き換える必要があります。

user> (count (re-find #"\d+" "123k456")) 
3 

(count (filter #(re-find #"(?!500)[56789]\d{2,}|\d{4,}$" %) 
       (line-seq rdr))) 
0:あなたは何をする必要があるか

が欲しいものは明らかにされていません

+0

私はそれを試して、私にコンソールがぎこちなくなり、巨大なチェーンを返しました0と5の... – JCD

+0

心配しないで、私はそれを試して、私は合理的な解決策を得た。文書の長さが10000行を超えていて、私は通過せず、すべて手で数えますが、動作するようです。ありがとう! – JCD

1

私が正しく質問を理解していれば、あなたはこのような何かやるべきこと:マーティン・レヒナーの答えについて

(defn countlines [] (with-open [rdr (clojure.java.io/reader "myfile.txt")] 
(-> (line-seq rdr) 
    (filter #(re-find #"(?!500)[56789]\d{2,}|\d{4,}$" %)) 
    (count)))) 
+1

括弧の中に 'count'を入れることは必須ではありません、btw。 https://clojuredocs.org/clojure.core/-%3E –

0

を、私は最後のスレッドを使用すべきだと思う( - >>)ではなく、最初のスレッド( - >)を。だからそれはする必要があります

(defn countlines [] (with-open [rdr (clojure.java.io/reader "myfile.txt")] (->> (line-seq rdr) 
(filter #(re-find #"(?!500)[56789]\d{2,}|\d{4,}$" %)) 
(count)))) 
関連する問題