我有一个玩具项目,我想在Redis数据库中添加一些字符串值。输入来自一个巨大的CSV文件。下面的(懒惰)函数工作正常,但我不知道如何将读入索引值的键添加到输入文件中 - 两个注释行。
你可以给我提示/网址/参考吗?谢谢!
(defn collector [myfile] (with-open [rdr (io/reader myfile)] (doseq [line (line-seq rdr)] ; [idx (iterate inc 0)] (let [[k v1 v2 v3 v4 v5 v6 v7] (clojure.string/split line #",")] (red/set db (str "key:" k) ;(str "key:" k ":" idx) (str v1 "-" v5 "-" v6))))))
答案 0 :(得分:1)
在不改变代码结构的情况下,你可以做的最好的事情是将索引附加到seq这样的行:
(doseq [[idx line] (map-indexed vector (line-seq rdr))] ...)
然后第二条评论线将按计划运作。
(map-indexed vector coll)
会将两个参数(索引和序列的元素)传递给vector
函数,生成它们的元组,并将解构bind [idx line]
绑定到所需的元素名。
这是一个常用的索引集合的习语。你也可以这样做:
(map vector (range) coll)
,其工作方式与map-indexed
相同,但这个习惯用法可用于制作任何集合的元组:
(map vector (range) [:a :b :c :d] (iterate (partial * 2) 1))
;;=> ([0 :a 1] [1 :b 2] [2 :c 4] [3 :d 8])