【问题标题】:read lazy seq - how to add the index阅读惰性序列 - 如何添加索引
【发布时间】:2016-11-06 18:23:43
【问题描述】:

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

你能给我提示/URL/参考吗?谢谢!

(定义收集器 [myfile] (with-open [rdr (io/reader myfile)] (剂量 [行(行序列 rdr)] ; [idx(迭代公司 0)] (让 [[k v1 v2 v3 v4 v5 v6 v7] (clojure.string/split line #",")] (红色/设置分贝 (str“键:”k) ;(str "key:" k ":" idx) (str v1 "-" v5 "-" v6))))))

【问题讨论】:

    标签: clojure


    【解决方案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])
    

    【讨论】:

    • 感谢您的帮助。我已经添加了您的代码行,但有些地方不正确,因为下一行会引发以下错误: CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/let, compile:(abc/ core.clj:14:5)
    • 不,:-(。我不能再重现错误了。现在它工作正常..谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 2010-11-06
    • 1970-01-01
    • 2017-03-04
    • 2014-11-10
    • 2016-09-19
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多