![](/img/trans.png)
[英]How to write a JSON object to a file to later be read in JuliaLang?
[英]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)
我認為你認為記錄在某種程度上比地圖更適合這個,據我所知,你沒有使用任何使記錄變得特別像多態的特征。 可能有辦法讓柴郡吐出記錄,但我不會打擾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.