我有以下哈希地图集合:
(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文件提供的新数据?
规则是:
code
列中找到master-data
内的old_code
,则使用csv文件中的code
值更改new_code
值。name
列中找到master-data
内的old_name
,则使用csv文件中的name
值更改new_name
值。答案 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"})