当我有一个以空格分隔的键时,如何在不重新创建键的情况下使用它来提取值?
我有一组潜在的键,实际上是列名,作为clojure-csv返回的数据中的第一个序列:(格式化为避免滚动。)
["AGY/DIV " "STS" "GIC-ID "
"LAST-NAME "
"FIRST-NAME "
"COVERAGE DESCRIPTION "
"PREMIUM "
"RUN-DATE"
"BIL MO "]
然后我从这一行创建密钥,并将密钥与每个后续的数据行(序列)进行zipmap:
(defn create-map-keys
"Takes a sequence, and turns it into viable keys for a map."
[in-seq]
(map (fn [element] (keyword element)) (map #(cstr/trim %1) in-seq)))
; gic-csv-keys
(:AGY/DIV :STS :GIC-ID :LAST-NAME :FIRST-NAME
:COVERAGE DESCRIPTION :PREMIUM :RUN-DATE :BIL MO)
(defn zip-apply-col-nams
[col-keys row]
(zipmap col-keys row))
对于测试数据,我将密钥压缩到csv-data的第二行。
(def zm2 (zip-apply-col-nams gic-csv-keys (first gic-csv-data)))
当我尝试从:COVERAGE DESCRIPTION
键中提取值时,我收到此错误
(:COVERAGE DESCRIPTION zm2)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: DESCRIPTION in this context, compiling:(NO_SOURCE_PATH:23)
然而,这有效:
(zm2 (keyword "COVERAGE DESCRIPTION"))
"HARVARD PILGRIM FAMILY - INSURED "
我是否应该修改以空格分隔的键以使用短划线替换空格,或者是否有另一种方式来引用该键而不重新创建它?
感谢。
答案 0 :(得分:6)
(keyword "some key")
不会“重新创建”某个关键字,实习一个关键字,这意味着当给定相同名称时,它将始终返回相同的关键字对象。您还可以存储返回的关键字并以这种方式重复使用:
(def coverage-description (keyword "COVERAGE DESCRIPTION"))
(coverage-description my-row-map)
答案 1 :(得分:2)
对于记录:“某些键”(目前)不是Clojure中的有效关键字。您应该用 - 或_替换空格。或者你应该使用普通字符串作为键并使用get
。