2011-11-14 49 views
1

我將我的matlab結構導出爲文本文件,以便我可以在clojure中讀取它們。 我有一個文本文件,如:從Clojure/Incanter中的文本文件讀取(MATLAB)結構的最佳方法

name 
Ali 
age 
33 
friends-ages 
30 
31 
25 
47 

知道我可以讀取該文件,但什麼是Clojure的方式將其轉換成類似:

(def person1 
    {:name "Ali" 
    :age 33 
    :friends-ages [30 31 25 47]}) 

或者讓更容易:

name 
Ali 
age 
33 

到:

(def person1 
    {:name "Ali" 
    :age 33}) 

回答

0

我最後寫一個.m文件到我的.MAT文件導出到文本,然後通過類似如下的進口他們:

(use '[clojure.string :only (split join)]) 

(defn kv [[k v]] 
    [(keyword k) v]) 

(let [a (split (slurp (java.io.FileReader. fileName)) #"\n")] 
     (def testNeuron (into {} (map kv (partition 2 a))))) 

多虧了哈姆扎和Jouni答案。 實際的代碼更是這樣的:

(def dataPath "/home/ali/Dropbox/Projects/Neurojure/") 
(def testFileName "dae062.c1.cylinder.DID.txt") 

(defn kv [[k v]] 
    [(keyword k) 
    (if (< 0 (count (re-seq #"\d\d\d\dSpikes|\d\d\d\dOcodes|\d\d\d\dOSpikes" k))) 
    (into [] (map (fn [x] (Integer/valueOf x)) (split v #","))) 
    (try (Integer/valueOf v) 
    (catch NumberFormatException _ v)))]) 


(let [a (split (slurp (java.io.FileReader. (str dataPath testFileName))) #"\n")] 
     (def testNeuron (into {} (map kv (partition 2 a))))) 

和轉換後的數據文件看起來像這樣:

ConvertDate 
18-Nov-2011 
Name 
/bgc/data/dae/062/dae062.mat 
frameperiod 
83.2500000037253 
Spike2Version 
1.27 
unstored 
167 
rfstr 
cm=rf-3.10,9.61:0.00x0.00,-135deg pe20 -2.0,-3.0 fx=0.00,fy=0.00cm=rf-3.10,9.61:0.00x0.00,-135deg pe20 -2.0,-3.0 fx=0.00,fy=0.00 
rf 
-3.1,9.61,0,0,-135,20,-2,-3,0,0 
trange 
47371169.75,100193717.5 
psych 
1 
rc 
0 
Options 

expname 
cylinder.dxXIdD 
Start 
94745610.75 
End 
100193717.5 
Area 
MT 
Ex 
perimenter Ali 
Trial=>0001Start 
47377343 
Trial=>0001TrialStart 
47377343 
Trial=>0001End 
47397224.25 
Trial=>0001dur 
19881.2500000075 
Trial=>0001uStim 
0 
Trial=>0001op 
40980 
Trial=>0001Trial 
1860 
Trial=>0001id 
15897 
Trial=>0001Startev 
47377149.5 
Trial=>0001serdelay 
-46.25 
Trial=>0001bstimes 
47377195.75 
Trial=>0001delay 
147.25 
Trial=>0001TrueEnd 
47397224.25 
Trial=>0001CorLoop 
0 
Trial=>0001dx 
0 
Trial=>0001Spikes 
-1402,-1232,1577,1931,2165,2222,2478,2773,2903,3229,3745,3820,4071,4588,4920,5141,5752,6440,6490,6664,6770,7042,7958,8081,8307,8622,8732,9021,9082,9343,9619,9695,9877,10357,10668,10943,11105,11364,11720,12272,12499,12762,12907,13621,14121,14351,14542,14588,15104,15420,15501,16331,16596,16843,17476,17698,17996,18169,18401,18532,18706,19029,19081,19418,19603,19750,20222 
Trial=>0001count 
65 
Trial=>0001OptionCode 
+do+aa+sq+72+se+fc+fb+ap+wt+cf+ws+ts+sw+bw+cs+2a+bm+gm+x2+sp+da+ao+cS+C3+CF 
Trial=>0001me 
0 
Trial=>0001OSpikes 
-1976,-1802,-1423,-1360,-1268,-1248,-1140,-244,-220,-164,632,681,730,760,779,786,867,879,924,1062,1161,1252,1268,1431,1533,1632,1946,2210,2235,2273,2285,2296,2305,2496,2532,2541,2732,2787,2806,2822,2840,3095,3292,3431,3598,3614,3837,4100,4482,4504,4515,4651,4768,4794,4936,5020,5160,5184,5300,5314,5710,5764,6431,6453,6471,6553,6561,6584,6791,7018,7124,7880,7905,7940,7968,8011,8315,8330,8352,8568,8666,8748,8756,8766,8797,8836,9038,9297,9328,9360,9471,9632,9639,9721,9939,10196,10363,10375,10387,10410,10931,10953,10969,10986,11038,11118,11135,11405,11692,12018,12163,12258,12492,12512,12525,12884,12899,12919,13156,13183,13638,13674,13842,13988,14110,14298,14310,14321,14606,14617,15124,15132,15150,15289,15341,15620,16293,16305,16342,16364,16441,16604,16692,16932,16997,17059,17086,17210,17368,17495,17626,17639,17651,17677,17718,18013,18247,18353,18553,18691,18722,18887,18941,19438,19774,19938,19959,19967,20004,20240,20306,20500,20623 
Trial=>0002Start 
47406914 
Trial=>0002TrialStart 
47406914 
Trial=>0002End 
47426795.25 
Trial=>0002dur 
19881.2499999925 
... 
2

我想你需要手動將文本文件(不是任何標準的序列化格式)轉換爲所需的設置格式。如果可能的話,我建議你應該以JSON格式提取MATLAB數據,並且使用json庫很容易讀取clojure。

5

假設每個文件都有一個記錄,

(defn parse [f] 
    (let [[_ name _ age _ & friends] (.split (slurp f) "\n")] 
    {:name name :age age :friends (map read-string friends)})) 

(parse "../../../Desktop/t.txt") 

你,

{:name "Ali", :age "33", :friends-ages (30 31 25 47)} 
+0

酷!但是,如果有記錄丟失了財產,如果沒有記錄的「年齡」,該怎麼辦?有沒有辦法解決這個問題? – Ali

+0

除非您定義鍵之間的分隔符,否則不能這樣做。 –

0

這裏是爲您簡單的問題的解決方案:

(ns example 
    (:require [clojure.string :as str])) 

(def input "name\nAli\nage\n33\n") ; you'd get this by reading the file 

(defn process [data] 
    (->> (str/split data #"\n") 
     (partition 2) 
     (map (fn [[k v]] 
       [(keyword k) 
       (try 
       (Integer/valueOf v) 
       (catch NumberFormatException _ 
        v))])) 
     (into {}))) 

(prn (process input)) 

完整的問題,需要更好地規範格式:你怎麼知道年齡列表已經完成?

+0

太棒了,什麼是'valueOf'我無法在clojuredocs.org中找到它? – Ali

+1

@Ali這是一個java調用,它將str解析爲一個Integer。 –

+1

@Jouni,而不是映射然後進入你可以減少seq分區後的地圖,這將使它更清潔。 –

相關問題