0
任何方式我都可以通过以下代码获得更多的惯用Clojure。我知道我错过了关于解构的一些东西。至少我可以说我理解当前的代码。我的第一个诱惑是使用doseq
,然后填充hash-map
,但我确信map
是解决方案。改善此Clojure代码以获得更多习惯用法
的代码读取一个CSV文件 - 由最高得分排序
Name,Department,Score
Rohan,IT,8
Bob,Sales,6
Tom,IT,9
Jane,Accounting,3
Mary,Sales,9
Harry,IT,8
Frodo,Marketing,8
Bilbo,Accounting,10
和将输出行。简单!
(def file "scores.csv")
(defn list-of-vecs []
(let [file-str (slurp file)]
(let [lines (clojure.string/split-lines file-str)]
(next (map #(clojure.string/split % #",") lines)))))
(defn list-of-maps []
(map (fn [n] {:name (n 0), :department (n 1), :score (Integer/parseInt (n 2))})
(list-of-vecs)))
(defn sorted-list []
(reverse (sort-by :score (list-of-maps))))
(defn print-high-scores []
(prn "Name","Department","Score")
(map (fn [m] (prn (m :name) (m :department) (m :score))) (sorted-list)))
任何反馈将不胜感激,包括在缩进。
另外我很惊讶的表现(跑在里面)。的8行25K线
parse-csv.core=> (time print-high-scores)
"Elapsed time: 0.026059 msecs"
CSV文件
CSV文件
parse-csv.core=> (time print-high-scores)
"Elapsed time: 0.025636 msecs"
还是我使用'time'不正确? –
更实际可靠的方法是使用CSV解析库。如果(引号)的值变成逗号,盲目地用逗号分割将会失败。你的情况是否可行?我认为这个问题更多地属于CodeReview.SE。你并没有真正解决问题,你正在寻找改进代码的方法。 –
Clojure有一个官方的CSV阅读器:https://github.com/clojure/data.csv然后做1:用一个简单的'map'解析整数。 2:'排序' – ClojureMostly