获取代理内容并将其转换为JSON

时间:2015-03-20 20:54:24

标签: clojure

我仍然是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)

请提前解答一些解释请帮忙!

1 个答案:

答案 0 :(得分:2)

您正在为代理提供一个函数作为其初始值。也许你打算对该函数进行异步调用?在这种情况下,future更适合您的方案,如图所示。 agent是同步的,它是sendsend-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,我假设您需要文件中的实际数据,而不是列表尼尔斯。