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

Update hash maps collection values based on another hash maps collection

我有以下哈希映射集合:

(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 文件的 old_code 列中找到 master-data 内的 code,则使用 csv 文件中的 new_code 值更改 code 值。
  2. 如果在 csv 文件的 old_name 列中找到 master-data 内的 name,则使用 csv 文件中的 new_name 值更改 name 值。

您需要映射您的主数据,检查 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))

回复:

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"})