将csv读入clojure中的列表

dan*_*kas 6 clojure

我知道有很多相关的问题,我已经阅读了它们,但仍然没有对如何读取 - 处理 - 写入有一些基本的了解.以下功能为例,它使用clojure-csv库来解析一行

(defn take-csv
  "Takes file name and reads data."
  [fname]
  (with-open [file (reader fname)]
    (doseq [line (line-seq file)]
      (let [record (parse-csv line)]))))
Run Code Online (Sandbox Code Playgroud)

我想要获得的是将数据读入某些集合,(def data (take-csv "file.csv"))然后再处理它.所以基本上我的问题是如何返回record或更确切地说是记录列表.

mob*_*yte 9

"doseq"通常用于具有副作用的操作.在您创建记录集合的情况下,您可以使用"map":

(defn take-csv
  "Takes file name and reads data."
  [fname]
  (with-open [file (reader fname)]
    (doall (map (comp first csv/parse-csv) (line-seq file)))))
Run Code Online (Sandbox Code Playgroud)

更好地解析整个文件以减少代码:

(defn take-csv
  "Takes file name and reads data."
  [fname]
  (with-open [file (reader fname)]
    (csv/parse-csv (slurp file))))
Run Code Online (Sandbox Code Playgroud)

您也可以使用clojure.data.csv而不是clojure-csv.core.只应该在前一个函数中将parse-csv重命名为take-csv.

(defn put-csv [fname table]
  (with-open [file (writer fname)]
    (csv/write-csv file table)))
Run Code Online (Sandbox Code Playgroud)