从Clojure中的矢量创建CSV

从Clojure中的矢量创建CSV,clojure,Clojure,我有这个 (defstruct book :title :year) (def e [ (struct book "John" 123) (struct book "Ashwani" 456) ]) 我想创建一个CSV文件,其中包含来自此向量的2行 John,123 Ashwani,456 我可以使用doseq在控制台上生成此结果 (doseq [x e] ( println (x :title) "," (x :year) )) 我

我有这个

(defstruct book :title :year)
(def e [
        (struct book "John" 123)
        (struct book "Ashwani" 456)
        ])
我想创建一个CSV文件,其中包含来自此向量的2行

John,123
Ashwani,456
我可以使用doseq在控制台上生成此结果

(doseq [x e]
  ( println (x :title) ","  (x :year)  ))
我试图使用
clojure.contrib.duck streams/spit
创建此CSV,但我无法迭代思想并创建字符串并将其传递给spit


实现这一目标的最佳方式是什么。我希望提出一些reduce函数,然后将其传递给spit并创建这个csv。(在C#中,我会打开一个流并写下每一行,最后关闭流并保存文件,我的大脑让我以每一种方式思考,但我确信一定有某种功能性的方法来实现这一点)

你可以用reduce和duck streams/spit来完成

但是使用duck流/写行可能更好。这样,您就不必担心使用正确的O/S相关行分隔符

(use 'clojure.contrib.duck-streams)

(write-lines f
  (map #(str (% :title) ","  (% :year)) e))

CSV并不像您想象的那么简单,例如,如果字符串中包含逗号,则需要引用字符串。最好看看clojure的csv阅读器/作者,例如,@Allex Ott-谢谢。在我的场景中,它不会,但您提供的链接对我的最终解决方案非常有帮助