2015-10-17 42 views
2

假设我具有相同的文件名,放置在五个不同的子文件夹中。有问题的文件在所有文件夹中具有相同的名称,但具有不同的值。函数参数作为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函数。

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

怎么能让最小的例子工作?

谢谢。

+0

你的代码有很多问题。首先,你试图读取一个名为./resources/SUB-FOLDER/test.csv的文件。读取csv文件通常非常简单,您可以举一个文件内容的例子吗? –

+0

当然:这些文件只包含约200行(六维)csv数据,如:232.2,100.5,12.2,23.0,12.2,90.2 – Astrid

回答

2

像这样的东西应该把你的数据从一个文件夹复制到序列的序列:

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

变化mapmapv如果你想有载体,并包裹forinto []如果你想要的向量向量。这假定folder是一个字符串。因为你的文件非常小,所以你不需要用阅读器打开它们,这样更容易理解它们,然后解析它们。

A闪光的问题与你的原代码:

  • 你总是试图读取文件名为"./resources/SUB-FOLDER/test.csv"而不是替换您的文件夹的名称。
  • 你不想在功能中使用def。见let
  • 在已经实现的序列上调用lazy-seq不起作用。
  • 通过在读者上调用doall,您将所有数据强制存储到内存中,而不是读取它并在处理时进行处理(这就是为什么我用slurp替换它的原因)。如果您在阅读时要循环处理它,则需要在循环外部(并且不要doall)使用with-open
+0

破解,谢谢! – Astrid