Clojure 阅读lazy seq-如何添加索引

Clojure 阅读lazy seq-如何添加索引,clojure,Clojure,我有一个玩具项目,我想在Redis db中添加一些字符串值。输入来自一个巨大的CSV文件。下面的(lazy)函数工作得很好,但我不知道如何将读取到输入文件中的索引值添加到键中——两行注释 你能给我一些提示/网址/参考资料吗?谢谢大家! (defn collector [myfile] (with-open [rdr (io/reader myfile)] (doseq [line (line-seq rdr)] ; [idx (i

我有一个玩具项目,我想在Redis db中添加一些字符串值。输入来自一个巨大的CSV文件。下面的(lazy)函数工作得很好,但我不知道如何将读取到输入文件中的索引值添加到键中——两行注释

你能给我一些提示/网址/参考资料吗?谢谢大家!

(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)))))) (defn收集器[myfile] (在打开[rdr(io/reader myfile)]的情况下) (doseq[行(行顺序rdr)] ;[idx(迭代inc 0)] (让[[k v1 v2 v4 v5 v7](clojure.string/split line#“,”)] (红色/设置分贝) (str“key:”k) ;(str“key:”k:“idx) (str v1-“v5”-“v6(()()()))
在不改变代码结构的情况下,最好的做法是将索引附加到seq行,如下所示:

(doseq[[idx行](映射索引向量(行顺序rdr))…)

然后第二行将按计划工作

(map indexed vector coll)
将两个参数(索引和序列元素)传递给
vector
函数,生成它们的元组,并对其进行解构绑定
[idx line]
将其元素绑定到所需的名称

这是索引集合的常用习惯用法。您也可以这样做:

(map vector(range)coll)
,其工作方式与
映射索引
相同,尽管此习惯用法可用于生成任何集合的元组:

(map vector (range) [:a :b :c :d] (iterate (partial * 2) 1))

;;=> ([0 :a 1] [1 :b 2] [2 :c 4] [3 :d 8])

谢谢你的帮助。我添加了您的代码行,但有点不正确,因为下一行引发了以下错误:CompilerException java.lang.RuntimeException:无法获取宏的值:#'clojure.core/let,compile:(abc/core.clj:14:5)no,:-(.我无法再复制错误了。现在它工作正常..谢谢!