2016-02-01 110 views
0

我有以下的哈希映射集合:更新哈希映射集值映射集合

(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. 如果code内部在csv文件old_code列中找到master-data然后使用来自csv文件new_code值更改code值。
  2. 如果name里面master-data找到old_name在csv文件列中然后更改name值使用new_name值从csv文件。
+0

其中Clojure的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

? – jmargolisvt

+0

@jmargolisvt:我正在使用data.csv-0.1.2 –

+0

你可以发布你试过的代码吗? – leonardoborges

回答

1

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

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

伟大的答案!谢谢@leetwinski。现在我不必将引用映射到我的现有代码中 –