簡體   English   中英

如何將json文件讀入Clojure defrecord(以后再搜索)

[英]How to read json file into Clojure defrecord (to be searched later)

我在Clojure REPL中創建了一個defrecord:

user=> (defrecord Data [column1 column2 column3])
user.Data

如何通過讀入.json文件自動將數據添加到此記錄? defrecord中的每一列都與json數據中的鍵完全對應。 如果文件包含單個記錄,它看起來類似於:

[
  {
    "column1" : "value1"
    "column2" : "value2"
    "column3" : "value3"
  }
]

但文件中有數千條這樣的記錄。

我可以像這樣啜飲文件的內容:

(json/read-json (slurp "path/to/file.json")))

read-json函數的依賴項被添加到我lein repl運行lein repl的目錄中找到的project.clj文件:dependencies [org.clojure/data.json "0.2.1"]

我只想使用Clojure函數搜索記錄的值,這樣我傳遞給搜索函數的值就在單個記錄的column1和column2值的值之間(即, nth-record.column1) .value <= query <= nth-record.column2.value )。 一旦找到匹配的記錄,我想在同一記錄中返回另一列的值(nth-record.column3.value)。 第1列和第2列的值將是唯一的,表示非重疊值范圍。 column3的值不是唯一的。

這似乎是一項相當簡單的任務,但我無法弄清楚如何使用Clojure文檔或我在網上找到的示例。 對我來說,如果記錄如何在Clojure內部存儲並不重要,只要我可以搜索它們並在同一記錄中返回相關字段的值。

使用data.json包:

(require '[clojure.data.json :as json])

將值讀入內存:

(def all-records (json/read-str (slurp "path/to/file.json")
                :key-fn keyword))
;; ==> [ { :column1 "value1", :column2 "value2", :column3 "value3" }, ...]

查找匹配的記錄:

(def query "some-value")
(def matching (filter #(and (< (:column1 %) query) (< query (:column2 %))) all-records))

獲取第3列:

(map :column3 matching)

將它們全部收集起來(並使其更加靈活):

(defn find-matching [select-fn result-fn records]
   (map result-fn (filter select-fn records)))

(defn select-within [rec query]
  (and (< (:column1 rec) query) (< query (:column2 rec))))

(find-matching #(select-within % "some-value") :column3 all-records)
  1. 應該使用柴油來提高速度。
  2. 如果您的查詢變得足夠復雜,請考慮使用lucene,clojure有一個很好的包裝器。

我認為你認為記錄在某種程度上比地圖更適合這個,據我所知,你沒有使用任何使記錄變得特別像多態的特征。 可能有辦法讓柴郡吐出記錄,但我不會打擾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM