2016-12-08 13 views
0

clojureを使用すると、文字列ファイルを読み込んでint配列またはベクトルに格納する方法を教えてください。Clojure:文字列ファイルを整数配列に置きます

ここまでは私の機能です。

(:require [clojure.java.io :as io]) 
(defn getData [filename] 
    (doseq [line 
    (with-open [rdr (io/reader filename)] 
     (doall (line-seq rdr)))] 
     (println line))) 

(defn convert [string] 
    (map #(Integer/parseInt %) 
    (.split #" " string))) 

ここからどこに行くのかわかりません。 getData関数が変換関数内でgetData関数を呼び出そうとしましたが、getData関数が文字列を返さないために運がなかった。

-> (apply convert (getData "num.txt")) 

答えて

0

あなたはClojureのに関するいくつかの詳細を読んで、おそらくあなたの理解を少しシャープに4clojureにおけるもののようないくつかの演習の上に行く必要があります。あなたの試みは非常に混乱しており、私はあなたがすべての行が何をしているのか理解できていないと思います。

本質的には、doseqですべての行を検索し、画面に出力すると、nilが返されます。次に、nilに変換を適用しようとします。 doallの結果を返すだけでよいはずです。

convert関数では、文字列のリストを分割しようとしているので、最初にsplitをリストにマップし、その結果にparseIntを呼び出します。 applyを使用してそれを呼び出す必要はありません。その代わりに、引数を文字列のリストとして扱う必要があります。もう少し意味があります。

0

まず、ファイルはどうですか?あなたが欲しいその後

(defn parse-line [str-line] 
    (->> (str/split str-line #" ") 
     (map #(Integer/parseInt %)))) 

は、私はあなたが整数の集合(STR /分割がclojure.stringからである)に行を解析したい、それがその

1 2 3 
4 5 6 
7 8 9 10 

まずようなものであると仮定しますこれをすべての行に適用する整数の大きな配列(java配列?)を返します。

(defn getData [filename] 
    (with-open [rdr (io/reader filename)] 
    (let [data (line-seq rdr)] 
     (int-array (mapcat parse-line data))))) 

別々の配列を持つようにします。

(defn getData [filename] 
    (with-open [rdr (io/reader filename)] 
    (let [data (line-seq rdr)] 
     (doall (map (comp int-array parse-line) data))))) 

Line-seqは一連の行を返します。したがって、たとえ1つの行を広告しても、line-seqはあなたの1行を含むシーケンスを返します。 ベクターが必要な場合は、int-arrayをvecに置き換えてください。シーケンスの場合は、int-arrayを削除します。

関連する問題