将哈希映射的集合转换为csv文件

red*_*nds 5 clojure

我有以下哈希映射集合:

{a:"Completed" b:1 c:"Friday" d:4}
{a:"Started" b:1 c:"Monday" d:4}
{a:"In Progress" b:1 c:"Sunday" d:1}
{a:"Completed" b:3 c:"Tuesday" d:9}
Run Code Online (Sandbox Code Playgroud)

如何在clojure中将其转换为CSV文件?

a,b,c,d
Completed,1,Friday,4
Started,1,Monday,4
In Progress,1,Sunday,1
Completed,3,Tuesday,9
Run Code Online (Sandbox Code Playgroud)

任何有关这方面的帮助将非常感激.

Bob*_*ton 15

你没有明确表示你是从JSON开始的,但让我们假设你是.我会使用cheshire 来解析你的JSON字符串,在这种情况下,是一个代表你数据的地图矢量.为了简单起见,我们假设您已经这样做了,只需使用var被调用data来避免使示例混乱.

现在我们可以创建一个向量向量,然后使用 clojure.data.csv将结果保存到文件中.

您可以使用lein try在REPL中尝试这一点.按照设置说明进行操作,lein try如果还没有,请运行 lein try clojure.data.csv 0.1.2.一旦你在这个依赖的REPL中:

(require '[clojure.data.csv :as csv] '[clojure.java.io :as io])

(def data
  [{:a "Completed"   :b 1 :c "Friday"  :d 4}
   {:a "Started"     :b 1 :c "Monday"  :d 4}
   {:a "In Progress" :b 1 :c "Sunday"  :d 1}
   {:a "Completed"   :b 3 :c "Tuesday" :d 9}])

(defn write-csv [path row-data]
  (let [columns [:a :b :c :d]
        headers (map name columns)
        rows (mapv #(mapv % columns) row-data)]
    (with-open [file (io/writer path)]
      (csv/write-csv file (cons headers rows)))))

(write-csv "/tmp/results.csv" data)
Run Code Online (Sandbox Code Playgroud)

现在您可以看到您的手工结果:

$ cat /tmp/results.csv
a,b,c,d
Completed,1,Friday,4
Started,1,Monday,4
In Progress,1,Sunday,1
Completed,3,Tuesday,9
Run Code Online (Sandbox Code Playgroud)


kos*_*tas 1

  1. 使用data.json将 json 转换为 clojure 映射序列。

  2. 使用映射解构转换为字符串序列:(map #(let [{a :a b :b c :c d :d} %] (str a "," b "," c "," d, "\n")) <your sequence of clojure maps>)

  3. 将字符串序列转储到文件中