如何使用空格分隔键访问值?

oct*_*bus 2 csv clojure map

当我有一个以空格分隔的键时,如何在不重新创建键的情况下使用它来提取值?

我有一组潜在的键,实际上是列名,作为从clojure-csv返回的数据中的第一个序列:(格式化为避免滚动.)

["AGY/DIV " "STS" "GIC-ID     " 
"LAST-NAME      " 
"FIRST-NAME     " 
"COVERAGE DESCRIPTION                                   " 
"PREMIUM  " 
"RUN-DATE" 
"BIL MO "]
Run Code Online (Sandbox Code Playgroud)

然后我从这一行创建密钥,并将密钥与每个后续的数据行(序列)进行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))
Run Code Online (Sandbox Code Playgroud)

对于测试数据,我将密钥压缩到csv-data的第二行.

(def zm2 (zip-apply-col-nams gic-csv-keys (first gic-csv-data)))
Run Code Online (Sandbox Code Playgroud)

当我尝试从:COVERAGE DESCRIPTION密钥中提取值时,我收到此错误

 (:COVERAGE DESCRIPTION zm2)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: DESCRIPTION in this context, compiling:(NO_SOURCE_PATH:23) 
Run Code Online (Sandbox Code Playgroud)

但是,这有效:

(zm2 (keyword "COVERAGE DESCRIPTION"))
"HARVARD PILGRIM FAMILY - INSURED                       "
Run Code Online (Sandbox Code Playgroud)

我应该修改空格分隔的键来替换空格,例如,破折号,还是有另一种方式来引用键而不重新创建它?

谢谢.

Joo*_*aat 6

(keyword "some key")不"重建"的关键字,实习生关键字,即给予相同的名称时,它总是会返回相同关键字的对象.您还可以存储返回的关键字并以这种方式重复使用它:

(def coverage-description (keyword "COVERAGE DESCRIPTION"))

(coverage-description my-row-map)
Run Code Online (Sandbox Code Playgroud)