2015-03-20 16 views
0

Я еще новичок в Clojure, и я пытаюсь создать приложение, которое прочитал два файла и записать разностное на JSON файлполучить содержание агента, и преобразовать его в формат 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})) 
) 

Im получаю исключение: Exception Не знаю, как писать JSON класса $ read_csv clojure.data.json/write-generic (json.clj: 385)

Пожалуйста, помогите с некоторым объяснением, спасибо заранее!

ответ

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 только для побочных эффектов, и всегда возвращает ноль. Если вы хотите, чтобы результаты считывались из файлов csv (с нетерпением ожидая, что вы все еще находитесь в зоне вызова with-open), используйте (doall (for ...)) в качестве замены для (doseq ...). Кроме того, необходимо удалить println в read-csv или заменить его на (doto (vec (re-seq #"[^,]+" line)) println), потому что println всегда возвращает nil, и я предполагаю, что вы хотите получить фактические данные из файла, а не список нил.

+0

Спасибо за ответ, который он работает, но теперь я получаю null для обоих "{\" my-data \ ": null, \" other-data \ ": null}" – Ravi

+0

см. Мое редактирование, доза всегда возвращает ноль – noisesmith

+0

большое спасибо :) Я пытаюсь поймать язык. – Ravi

Смежные вопросы