2

スペースで区切られたキーがある場合、それを使用してキーを再作成せずに値を抽出するにはどうすればよいですか?

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 の 2 行目に zipmap します。

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

スペースで区切られたキーを変更して、スペースをダッシュ​​などに置き換える必要がありますか、またはキーを再作成せずにキーを参照する別の方法はありますか?

ありがとう。

4

2 に答える 2

6

(keyword "some key")キーワードを「再作成」するのではなく、キーワードをインターンします。つまり、同じ名前を指定すると、常に同じキーワード オブジェクトが返されます。返されたキーワードを保存して、そのように再利用することもできます。

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

(coverage-description my-row-map)
于 2012-08-13T16:42:26.673 に答える
2

記録のために: "some key" は (現時点では) Clojure では有効なキーワードではありません。空白を - または _ に置き換える必要があります。または、プレーン文字列をキーとして使用し、 を使用する必要がありますget

于 2012-08-14T06:03:38.220 に答える