【问题标题】:How to access a value using a space-separated key?如何使用空格分隔的键访问值?
【发布时间】:2012-08-09 20:53:52
【问题描述】:

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

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

["AGY/DIV " "STS" "GIC-ID     " 
"LAST-NAME      " 
"FIRST-NAME     " 
"COVERAGE DESCRIPTION                                   " 
"PREMIUM  " 
"RUN-DATE" 
"BIL MO "]

然后我从这一行创建键并将键与每个后续数据行(序列)压缩映射:

(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 数据的第二行。

(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                       "

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

谢谢。

【问题讨论】:

    标签: csv map clojure


    【解决方案1】:

    (keyword "some key") 不会“重新创建”关键字,它interns 是一个关键字,这意味着当给定相同的名称时,它将始终返回相同的关键字对象。您还可以存储返回的关键字并以这种方式重新使用它:

    (def coverage-description (keyword "COVERAGE DESCRIPTION"))
    
    (coverage-description my-row-map)
    

    【讨论】:

      【解决方案2】:

      郑重声明:“某个键”(目前)在 Clojure 中不是有效的关键字。您应该将空格替换为 - 或 _。或者你应该使用纯字符串作为键并使用get

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 2020-06-17
        • 1970-01-01
        相关资源
        最近更新 更多