2015-10-17 39 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