来自OOP,我在调整Clojure的不变性方面遇到了一些麻烦。
我想要做的是从文件中获取一些变量,并将每个变量及其数据存储到地图中。
换句话说,我想提取'来自文本文件的地图。
例如,文件看起来像这样:
username: michael
password: foo123
email: barfoo@gmail.com
我的问题是,如何将上述文件转换为这样的地图:(?)
{:username "michael", :password "foo123", :email "barfoo@gmail.com"}
这是我到目前为止所做的,但我不知道如何获得多个变量:
(with-open [rdr (reader "/path/to/file.txt")]
(doseq [line (line-seq rdr)]
// make map here somehow? ))
答案 0 :(得分: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: barfoo@gmail.com"]
user=> (->> (clojure.string/split (slurp "yourfile.txt") #"\n")
(map #(clojure.string/split % #":\s*")))
(["username" "michael"] ["password" "foo123"] ["email" "barfoo@gmail.com"])
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 "barfoo@gmail.com"])
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 "barfoo@gmail.com"}