2014-07-16 1 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

관련 문제