6

次のハッシュ マップのコレクションがあります。

{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}

これをclojureでCSVファイルに変換するにはどうすればよいですか?

すなわち

a,b,c,d
Completed,1,Friday,4
Started,1,Monday,4
In Progress,1,Sunday,1
Completed,3,Tuesday,9

これについての助けは大歓迎です。

4

5 に答える 5

18

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)

これで、手作業の結果を確認できます。

$ 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
于 2014-05-19T05:29:56.667 に答える
1
(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}])

(for [i (range (count data))]
       (if (= i 0) 
        (do 
            (spit "data.csv" (str (clojure.string/join "," (map name (keys (data i)))) "\n") :append true) 
            (spit "data.csv" (str (clojure.string/join "," (vals (data i))) "\n") :append true)) 
        (spit "data.csv" (str (clojure.string/join "," (vals (data i))) "\n") :append true)))

結果を表示するには:

$ cat data.csv
c,b,d,a
Friday,1,4,Completed
Monday,1,4,Started
Sunday,1,1,In Progress
Tuesday,3,9,Completed

この方法はデータからすべてを取得し、何もハードコーディングする必要がないため、この回答の方が優れています。また、このメソッドは、clojure.string/join.

于 2016-02-02T11:53:01.943 に答える
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. 文字列のシーケンスをファイルにダンプする

于 2013-09-03T12:11:26.820 に答える