我在Clojure REPL中创建了一个defrecord:
user=> (defrecord Data [column1 column2 column3])
user.Data
Run Code Online (Sandbox Code Playgroud)
如何通过读入.json文件自动将数据添加到此记录?defrecord中的每一列都与json数据中的键完全对应.如果文件包含单个记录,它看起来类似于:
[
{
"column1" : "value1"
"column2" : "value2"
"column3" : "value3"
}
]
Run Code Online (Sandbox Code Playgroud)
但文件中有数千条这样的记录.
我可以像这样啜饮文件的内容:
(json/read-json (slurp "path/to/file.json")))
Run Code Online (Sandbox Code Playgroud)
read-json函数的依赖项被添加到我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内部存储并不重要,只要我可以搜索它们并在同一记录中返回相关字段的值.
ffr*_*end 11
使用data.json包:
(require '[clojure.data.json :as json])
Run Code Online (Sandbox Code Playgroud)
将值读入内存:
(def all-records (json/read-str (slurp "path/to/file.json")
:key-fn keyword))
;; ==> [ { :column1 "value1", :column2 "value2", :column3 "value3" }, ...]
Run Code Online (Sandbox Code Playgroud)
查找匹配的记录:
(def query "some-value")
(def matching (filter #(and (< (:column1 %) query) (< query (:column2 %))) all-records))
Run Code Online (Sandbox Code Playgroud)
获取第3列:
(map :column3 matching)
Run Code Online (Sandbox Code Playgroud)
将它们全部收集起来(并使其更加灵活):
(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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5076 次 |
| 最近记录: |