clojure - 为什么这个关键字函数查找在 HashMap 中不起作用?

标签 clojure

我想我需要一些眼球才能理解这一点

    (println record)
    (println (keys record) " - " (class record) " : " (:TradeId record) (:Stock record))
    (doall  (map #(println "Key " % "Value " (% record)) (keys record)))

输出:

{:Stock ATT, :AccountId 1, :TradeId 37, :Qty 100, :Price 117, :Date 2011-02-24T18:30:00.000Z, :Notes SPLIT 1:10, :Type B, :Brokerage 81.12}

(:Stock :AccountId :TradeId :Qty :Price :Date :Notes :Type :Brokerage)  -  clojure.lang.PersistentHashMap  :  nil ATT

Key  :Stock Value  ATT
Key  :AccountId Value  1
Key  :TradeId Value  37
...

问题是 (:TradeId record) 不起作用,即使它作为 key 存在。迭代所有键和值 - 第 3 行 - 产生正确的值。 尝试重命名 csv 中的列,但行为没有变化。除了这是 csv 中的第一列之外,我看不出与其他列(有效)有什么区别。

HashMap 是通过这样的代码创建的 - 从 CSV 读取记录。 clojure.data.csv 包中的标准代码。

(->> (csv/read-csv reader)
           csv-data->maps
           (map #(my-function some-args %))
           doall))


(defn csv-data->maps 
  "Return the csv records as a vector of maps"
  [csv-data]
  (map zipmap
       (->> (first csv-data) ;; First row is the header
            (map keyword) ;; Drop if you want string keys instead
            repeat)
       (rest csv-data)))

最佳答案

“第一列”的东西绝对是可疑的,它指向一些不可见的字符,例如 BOM悄悄地将其自身附加到您的第一个关键字上。

要调试,请尝试打印出关键字名称的十六进制。和/或者如果您进行十六进制转储,您可能会看到一些内容,例如使用 head -n 2 file.csv | od -x,输入文件的前几行。

关于clojure - 为什么这个关键字函数查找在 HashMap 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66058835/

相关文章:

swing - 使用跷跷板启用全屏?

clojure - 如何在 compojure 请求中获取特定的 http header

vector - Clojure:对 map 向量中 map 中的每个值应用函数

clojure - 如何使用 pprint 格式化多行 map ?

Clojure 的映射 : are keys and vals in same order?

clojure - 使用 Clojure 编写脚本

clojure - Base64 解码字符串 - emacs 与 jvm 不同?

clojure - 为什么+(或*)对于零参数的行为与-(或/)不同?

constructor - Clojure:从字符串类名创建新实例

clojure - 在环形应用程序中捕获异常的惯用方法