根据另一个哈希映射集合更新哈希映射集合值

时间:2016-02-01 02:37:41

标签: csv clojure hashmap updates

我有以下哈希地图集合:

(def master-data [
    {:code "1234" :name "Jhon"}
    {:code "5678" :name "Brown"}
    {:code "9999" :name "Steven"}
])

我在csv文件中有这些信息的数据:

old_code,new_code,old_name,new_name
1234,2222,Jhon,Travolta
4321,3456,Steven,Cody

如何将内部主数据的值更改为csv文件提供的新数据?

规则是:

  1. 如果在csv文件的code列中找到master-data内的old_code,则使用csv文件中的code值更改new_code值。
  2. 如果在csv文件的name列中找到master-data内的old_name,则使用csv文件中的name值更改new_name值。

1 个答案:

答案 0 :(得分:1)

您需要映射主数据,检查csv中的每个项目并在需要时更新主数据条目。

(defn update-if [item key check new-val]
  "utility function. updates a value for a key, setting it to new-val if it equals check"
  (if (= (item key) check)
    (assoc item key new-val)
    item))

(defn update-data [data mappings]
  (map (fn [item]
         (reduce (fn [item [old-code new-code old-name new-name]]
                   (-> item
                       (update-if :code old-code new-code)
                       (update-if :name old-name new-name)))
                 item
                 mappings))
       data))

在repl中:

ttask.core> (def master-data [{:code "1234" :name "Jhon"}
                              {:code "5678" :name "Brown"}
                              {:code "9999" :name "Steven"}])
#'ttask.core/master-data

ttask.core> (def input "old_code,new_code,old_name,new_name
1234,2222,Jhon,Travolta
4321,3456,Steven,Cody")
#'ttask.core/input

ttask.core> (update-data master-data (rest (csv/read-csv input)))
({:code "2222", :name "Travolta"} {:code "5678", :name "Brown"} {:code "9999", :name "Cody"})