获取代理内容并将其转换为 JSON
get agent content and convert it to JSON
我还是 clojure 的新手,我正在尝试构建读取两个文件并将差异写入 JSON 文件
的应用程序
(defn read-csv
"reads data."
[]
(with-open [rdr (
io/reader "resources/staples_data.csv")]
(doseq [line (rest(line-seq rdr))]
(println(vec(re-seq #"[^,]+" line))))))
(defn read-psv
"reads data."
[]
(with-open [rdr (
io/reader "resources/external_data.psv")]
(doseq [line (rest(line-seq rdr))]
; (print(vec(re-seq #"[^|]+" line))))))
(doall(vec(re-seq #"[^|]+" line))))))
(defn process-content []
(let [csv-records (agent read-csv)
psv-records (agent read-psv)]
(json/write-str {"my-data" @csv-records "other-data" @psv-records}))
)
我遇到异常:异常不知道如何写 JSON of class $read_csv clojure.data.json/write-generic (json.clj:385)
请帮忙解释一下,在此先感谢!
您正在为代理提供一个函数作为其初始值。也许您打算改为对该函数进行异步调用?在这种情况下,future
更适合您的场景,如图所示。 agent
是同步的,send
和 send-off
是异步的,它们假设您正在跨调用传播某些状态,这与您在此处的用法不匹配。
(defn process-content []
(let [csv-records (future-call read-csv)
psv-records (future-call read-psv)]
(json/write-str {"my-data" @csv-records "other-data" @psv-records})))
之后的问题是doseq
只是副作用,总是returns nil。如果你想从 csv 文件中读取结果(急切地评估所以你仍然在 with-open
调用的范围内),请使用 (doall (for ...))
代替 (doseq ...)
。此外,read-csv
中的 println
需要删除,或替换为 (doto (vec (re-seq #"[^,]+" line)) println)
,因为 println 总是 returns nil,我假设您想要文件中的实际数据,不是 nils 列表。
我还是 clojure 的新手,我正在尝试构建读取两个文件并将差异写入 JSON 文件
的应用程序(defn read-csv
"reads data."
[]
(with-open [rdr (
io/reader "resources/staples_data.csv")]
(doseq [line (rest(line-seq rdr))]
(println(vec(re-seq #"[^,]+" line))))))
(defn read-psv
"reads data."
[]
(with-open [rdr (
io/reader "resources/external_data.psv")]
(doseq [line (rest(line-seq rdr))]
; (print(vec(re-seq #"[^|]+" line))))))
(doall(vec(re-seq #"[^|]+" line))))))
(defn process-content []
(let [csv-records (agent read-csv)
psv-records (agent read-psv)]
(json/write-str {"my-data" @csv-records "other-data" @psv-records}))
)
我遇到异常:异常不知道如何写 JSON of class $read_csv clojure.data.json/write-generic (json.clj:385)
请帮忙解释一下,在此先感谢!
您正在为代理提供一个函数作为其初始值。也许您打算改为对该函数进行异步调用?在这种情况下,future
更适合您的场景,如图所示。 agent
是同步的,send
和 send-off
是异步的,它们假设您正在跨调用传播某些状态,这与您在此处的用法不匹配。
(defn process-content []
(let [csv-records (future-call read-csv)
psv-records (future-call read-psv)]
(json/write-str {"my-data" @csv-records "other-data" @psv-records})))
之后的问题是doseq
只是副作用,总是returns nil。如果你想从 csv 文件中读取结果(急切地评估所以你仍然在 with-open
调用的范围内),请使用 (doall (for ...))
代替 (doseq ...)
。此外,read-csv
中的 println
需要删除,或替换为 (doto (vec (re-seq #"[^,]+" line)) println)
,因为 println 总是 returns nil,我假设您想要文件中的实际数据,不是 nils 列表。