2015-08-27 88 views
0

我知道如何使用[clojure.data.csv]來寫入CSV但是我不知道如何以這種特定格式編寫CSV。Clojure將2d數組寫入csv

我想寫入CSV的數據是使用[clojure.java.jdbc]as-arrays? true改性劑,它返回一個二維陣列的DB查詢的結果,其中[0][1]是需要成爲CSV的headers然後[x][y]將成爲所述column names要寫入這些標題的數據,因此[1][0]會將第一個返回的行和第0列寫入第一個標題下的CSV。

(with-open [out-file (io/writer "out-file.csv")] 
    (csv/write-csv out-file 
     [["abc" "def"] 
     ["ghi" "jkl"]])) 

以上是寫入CSV文件的示例,但我不確定如何使用我的查詢結果並將值寫入CSV。

的數據將是這樣的:

[[header1, header2, header3] 
[val1, val2, val3] 
[val1, val2, val3]] 

查詢看起來是這樣的:

(j/query db ["$SOME_QUERY"] as-arrays? true)) 

有人可以有幫助呢?

編輯:更新這是我到目前爲止有:

(defn write-query-to-csv [query db output-filename] 
    (log/info (str "Executing " query " on " db)) 
    (let [results (j/query db ["$QUERY"] 
         :as-arrays? true) 
     header (->> results 
        first) 
     data (->> results)] 
    (with-open [out-file (io/writer output-filename)] 
     (csv/write-csv out-file 
        (reduce conj (conj [] header) data))) 
    (io/file output-filename))) 

頭數據是正確的,但我不能確定如何填充數據variabale:/

+0

's/FILL THIS IN/rest /'? – cfrick

+0

@cfrick這是一個壞的複製粘貼從我,它不應該在那裏! –

+0

在我看來,數據是一系列的序列,在'let'中拉出頭部序列,但不要將其從數據中剝離。所以現在'header'包含一系列標題標籤,'data'包含標題序列加數據序列(每行一個序列)。 'reduce'行將頭部序列重新添加到序列序列中 - 現在它包含兩個頭部序列。它看起來好像'let'只需要綁定'result',然後你可以不加修改地傳遞'result'作爲'write-csv'的第二個參數。而已。我誤解了什麼嗎? – Mars

回答

1

它看起來對我來說,results是一系列序列,在let中,您將標題序列拉出,但不要將其從數據中剝離。然後header包含一系列標題標籤,並且data包含標題序列加數據序列(每行一個序列)。 reduce行將標題序列重新添加到序列序列中 - 現在它包含兩個標題序列。大部分是沒有必要的。由於results是正確的格式,以傳遞給write-csv,該let只需要綁定results,然後你就可以在沒有修改的第二個參數傳遞resultswrite-csv,像這樣:

(defn write-query-to-csv [query db output-filename] 
    (log/info (str "Executing " query " on " db)) 
    (let [results (j/query db ["$QUERY"] 
         :as-arrays? true)] 
    (with-open [out-file (io/writer output-filename)] 
     (csv/write-csv out-file result) 
    (io/file output-filename))) 

所以你不」在這裏需要reduce線路,但是爲了將來的參考,可能會更清楚地用(vector header)代替(conj [] header)。另外,編寫整個reduce表達式的另一種方式是(cons header data)。這將返回一個不同於reduce系列的序列,但write-csv不會在乎,我認爲性能應該類似。你也可以使用(into (vector header) data)