如何从Clojure中的文件中读取多个变量?

时间:2014-07-16 01:44:02

标签: file loops map clojure lisp

来自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? ))

1 个答案:

答案 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"}