我仍然是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}))
)
我得到一个异常:异常不知道怎么写类$ read_csv的jSON clojure.data.json / write-generic(json.clj:385)
请提前解答一些解释请帮忙!
答案 0 :(得分:2)
您正在为代理提供一个函数作为其初始值。也许你打算对该函数进行异步调用?在这种情况下,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
仅用于副作用,并且总是返回nil。如果您希望从csv文件中读取结果(急切地评估,因此您仍然在with-open
调用的范围内),请使用(doall (for ...))
替代(doseq ...)
。此外,println
中的read-csv
将需要删除,或替换为(doto (vec (re-seq #"[^,]+" line)) println)
,因为println始终返回nil,我假设您需要文件中的实际数据,而不是列表尼尔斯。