2013-01-01 58 views
1

看來,當我評估整個文件它沒有問題。是否clooj評估逐行或整行

(ns ShipDataRecord 
    (:import [java.util.Date] 
    [org.joda.time.DateTime] 
    [org.joda.time.Seconds] 
    [org.joda.time.format.*] 
    [semsav.RecordSplitter])) 
(require '[clojure.data.csv :as csv] 
     '[clojure.java.io :as io]) 

(defrecord Record [W1 W2 W3]) 

(defn read-csv [fname count] 
    (with-open [file (reader fname)] 
    (doall (take count (map (comp first csv/read-csv) 
          (line-seq file)))))) 

(map #(apply ->Record %) (read-csv "test.csv" 1)) 

但是,當我逐行評估它似乎給我一個問題。

因此評估文件後,我跑這條線在REPL

(:W3 (first Record)) 

,但它給了我拋出IllegalArgumentException的編譯器例外不知道如何從創建ISEQ:java.lang.Class中的Clojure。 lang.RT.seqFrom(RT.java:494)。

我GOOGLE了一下,但我似乎無法找到問題。我已經在另一個問題中提出了這個問題,但由於詞語太長,我必須創建一個新問題

回答

1

(:W3 (first Record))中,符號Record代表類別Record。我想從你以前的文章中,你只想從(map #...)產生的記錄收集的第一個記錄獲得:W3字段。因此,所有你需要的是直接從map表達或變量得到這個值,可以存儲表達式的結果:

(:W3 (first (map #(apply ->Record %) (read-csv "1.csv" 1)))) 

(def records (map #(apply ->Record %) (read-csv "1.csv" 1))) 

(:W3 (first records)) 
+0

我只想問,如果值:W3現在被映射到記錄?原諒我的問題,因爲我不習慣函數式編程 – aceminer

+0

變量'記錄'包含由'map'函數創建的Record類對象的集合。因此,通過「第一」功能,您可以獲得此集合的第一個對象。通過':W3'你可以從這個對象獲得':W3'字段。 – mobyte

+0

繼續收到此錯誤:CompilerException java.lang.RuntimeException:無法解析符號: - >在此上下文中編譯:(ShipDataRecord.clj:97) 已嘗試使用此行(println(:W3(first記錄)))但它似乎不工作 – aceminer