read lazy seq - 如何添加索引

时间:2016-07-05 02:51:31

标签: clojure

我有一个玩具项目,我想在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))))))

1 个答案:

答案 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])