有没有办法简化地图中的地图?

时间:2012-11-06 14:06:34

标签: clojure

我的数据是一系列称为re-val的序列。数据从.csv文件中读取。以下是数据样本:

("      4999" "186300" "    194300" "         0" "380600" "325 " "57" 0)
("      1037" "184200" "    458800" "      6300" "649300" "111 " "124" 0)

是否有更简单,更清晰的方法将修剪应用于每个序列的每个成员而不是以下?

(def val1 (map (fn [x] (map #(cstr/trim %) x)) re-val))

def用于repl诊断目的。实际的s-o-s将被送入文件写入功能。

以下是(second val1)数据的外观。

("37" "184200" "458800" "6300" "649300" "111" "124" "0")

3 个答案:

答案 0 :(得分:2)

您的解决方案可能会有所改进:

(def val1 (map #(map cstr/trim %) re-val))

为了使其更具可读性,我可能会使用for

(def val1 (for [line re-val] (map trim line)))

但这不会减少字符数......

答案 1 :(得分:1)

这有效:

user> (def l '("        28" "186300" "    194300" "         0" "380600" "325 " "57" 0))
#'user/l
user>  (map trim (vec l))
("28" "186300" "194300" "0" "380600" "325" "57" "0")

答案 2 :(得分:1)

=>((partial map (partial map clojure.string/trim)) data)

(("28" "186300" "194300" "0" "380600" "325" "57" "0")
 ("37" "184200" "458800" "6300" "649300" "111" "124" "0"))

如果您有多个嵌套集合,或深度未知的集合,并且您希望修剪所有字符串,则还可以使用散步

=>(use 'clojure.walk)
  (postwalk #(if (string? %) (clojure.string/trim %) %) data)

[["28" "186300" "194300" "0" "380600" "325" "57" 0]
 ["37" "184200" "458800" "6300" "649300" "111" "124" 0]]