2014-07-16 57 views
1

來自OOP,我在調整Clojure的不變性方面遇到了一些麻煩。如何從Clojure中的文件中讀取多個變量?

我想要做的是從文件中獲取一些變量,並將每個變量及其數據存儲到一張地圖中。

換句話說,我想從文本文件中「提取」地圖。

作爲一個例子,該文件是這樣的:

username: michael 
password: foo123 
email: [email protected] 

我的問題是,我該如何轉換上面的文件轉換成地圖是這樣的:(?)

{:username "michael", :password "foo123", :email "[email protected]"} 

這就是我有這麼遠,但我不知道如何讓多個變量:

(with-open [rdr (reader "/path/to/file.txt")] 
    (doseq [line (line-seq rdr)] 
    // make map here somehow?)) 

回答

4

試試這個:

(->> (clojure.string/split (slurp "yourfile.txt") #"\n") 
    (map #(clojure.string/split % #":")) 
    (map (fn [[k v]] [(keyword k) v])) 
    (into {})) 

slurp函數讀取文件並返回一個文件內容的字符串。將文本文件讀入字符串很有用。之後,將字符串拆分爲\n,這會反轉一系列字符串。然後分割每個字符串:

您可以檢查REPL每一步,看看每一步的結果,就像這樣:

user=> (->> (clojure.string/split (slurp "yourfile.txt") #"\n")) 
["username: michael" "password: foo123" "email: [email protected]"] 
user=> (->> (clojure.string/split (slurp "yourfile.txt") #"\n") 
      (map #(clojure.string/split % #":\s*"))) 
(["username" "michael"] ["password" "foo123"] ["email" "[email protected]"]) 
user=> (->> (clojure.string/split (slurp "yourfile.txt") #"\n") 
      (map #(clojure.string/split % #":\s*")) 
      (map (fn [[k v]] [(keyword k) v]))) 
([:username "michael"] [:password "foo123"] [:email "[email protected]"]) 
user=> (->> (clojure.string/split (slurp "yourfile.txt") #"\n") 
      (map #(clojure.string/split % #":\s*")) 
      (map (fn [[k v]] [(keyword k) v])) 
      (into {})) 
{:username "michael", :password "foo123", :email "[email protected]"} 
+0

完全,工作,教了我不少!感謝您的幫助。 –

+2

爲了擺脫每個值的初始空間,在'#「上分割:\ s *」' - 一個冒號後跟(可選)任意數量的空格。 –

+0

@DaveYarwood哎呀。我沒有注意到冒號後的空白處。我更新了答案。 – ntalbs