Text の構造は次のとおりです。
Tag001
0.1, 0.2, 0.3, 0.4
0.5, 0.6, 0.7, 0.8
...
Tag002
1.1, 1.2, 1.3, 1.4
1.5, 1.6, 1.7, 1.8
...
ファイルには任意の数の TagXXX を含めることができ、各タグには任意の数の CSV 値行を含めることができます。
====PPPS。(これらのもので申し訳ありません:-)
その他の改善; 現在、atom ラップトップで 31842 行のデータを処理するのに約 1 秒かかります。これは、元のコードよりも 7 倍高速です。ただし、C 版はこれより 20 倍高速です。
(defn add-parsed-code [accu code]
(if (empty? code)
accu
(conj accu code)))
(defn add-values [code comps]
(let [values comps
old-values (:values code)
new-values (if old-values
(conj old-values values)
[values])]
(assoc code :values new-values)))
(defn read-line-components [file]
(map (fn [line] (clojure.string/split line #","))
(with-open [rdr (clojure.java.io/reader file)]
(doall (line-seq rdr)))))
(defn parse-file [file]
(let [line-comps (read-line-components file)]
(loop [line-comps line-comps
accu []
curr {}]
(if line-comps
(let [comps (first line-comps)]
(if (= (count comps) 1) ;; code line?
(recur (next line-comps)
(add-parsed-code accu curr)
{:code (first comps)})
(recur (next line-comps)
accu
(add-values curr comps))))
(add-parsed-code accu curr)))))
==== PPS。
最初のものは2番目のものよりも10倍速い理由はわかりませんが、slurpの代わりにmapとwith-openを使用すると読み取りが速くなります。全体の読み取り/処理時間はそれほど短縮されていませんが (7 秒から 6 秒に)
(time
(let [lines (map (fn [line] line)
(with-open [rdr (clojure.java.io/reader
"DATA.txt")]
(doall (line-seq rdr))))]
(println (last lines))))
(time (let [lines
(clojure.string/split-lines
(slurp "DATA.txt"))]
(println (last lines))))
====追伸。Skuro のソリューションは機能しました。しかし、解析速度はそれほど速くないので、読み取りと統計解析部分のみDBとclojureを構築。