gpt4 book ai didi

json - 如何将json文件读入Clojure defrecord(稍后搜索)

转载 作者:行者123 更新时间:2023-12-02 05:51:01 26 4
gpt4 key购买 nike

我在 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 的目录中找到的 project.clj 文件中::dependencies [org.clojure/data.json "0.2.1"].

我希望能够使用 Clojure 函数搜索记录的值,这样我传递给搜索函数的值介于单个记录的 column1 和 column2 值之间(即 nth-record.column1.value <= 查询 <= 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)

关于json - 如何将json文件读入Clojure defrecord(稍后搜索),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15660066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com