函数参数作为Clojure中文件路径的一部分

时间:2015-10-17 13:41:02

标签: csv clojure

假设我有相同的文件名,放在五个不同的子文件夹中。有问题的文件在所有文件夹中具有相同的名称,但具有不同的值。

假设我的文件被称为test.csv。我的文件夹是A1,A2,A3,A4A5

我的数据读取结构如下:

(defn my-data [folder]
  (loop [SUB-FOLDER (str 'folder)
         X []
         data (with-open [file (clojure.java.io/reader "./resources/SUB-FOLDER/test.csv")]
                (doall (csv/read-csv file)))]
    (def row (first data))
    (if (nil? row)
      [(lazy-seq X)]
      (recur (conj X (map #(Float/parseFloat %) row))
             (rest data)))))

我会把这个函数称为

(def Y (map vec (get (my-data A1) 0)))

我试图访问子文件夹test.csv中的文件A1,我将其作为参数传递给我的csv-read函数。

现在显然上面的代码不起作用,但它提供了我想要实现的内容的概述。

如何让最小的例子起作用?

感谢。

1 个答案:

答案 0 :(得分:2)

这样的事情应该把你的数据从一个文件夹放到一系列序列中:

(defn read-data [folder]
  (let [data (csv/read-csv (slurp (str "./resources/" folder "/test.csv")))]
    (for [line data]
      (map #(Float/parseFloat %) line))))

如果您想要向量,请将map更改为mapv,如果您想要向量向量,请将forinto []包装在一起。这假设folder是一个字符串。因为你的文件非常小,你不需要用阅读器打开它们,所以更容易啜饮它们然后解析它们。

您的原始代码存在问题:

  • 您总是尝试阅读名为"./resources/SUB-FOLDER/test.csv"的文件,而不是替换文件夹的名称。
  • 您不想在函数中使用def。请参阅let
  • 在已经实现的序列上调用lazy-seq不会执行任何操作。
  • 通过在您的阅读器上调用doall,您可以将所有数据强制存储到内存中,而不是随时读取和处理(这就是为什么我用slurp替换它)。如果您在阅读时要在循环中处理它,那么您希望循环外的with-open(并且没有doall)。