2013-01-12 85 views
0

比較行的我必須寫一個Clojure的功能,在文件比較行。 我的文件中包含這樣的信息:Clojure的文件

{:something1 1 
    :something2 2 
    :something2 2 
    :something3 3 
    :something4 4 
    :something4 4 
} 

你可以看到它被寫入定義一個哈希值。我想在我的程序中導入哈希,但在此之前,我需要刪除每行等於其他行的行。我的線路需要獨特。我怎樣才能做到這一點? 我嘗試了一些東西,但他們完成失敗。

+0

將您輸入包含重複鍵,重複的值,或兩者兼而有之? –

+0

我已編輯帖子。 – mzdravkov

回答

1
(defn read-map-wo-dups [fname] 
    (into {} 
    (with-open [r (reader fname)] 
    (doall (distinct 
      (map #(read-string 
        (str "[" (replace % #"[{}]" "") "]")) 
        (line-seq r))))))) 

測試:

data.dat包含:

{:something1 1 
:something2 2 
:something2 2 
:something3 3 
:something3 3 
:something4 4} 

結果:

(read-map-wo-dups "data.dat") 
=> {:something1 1, :something2 2, :something3 3, :something4 4} 
+0

謝謝,你是我的英雄。 :) – mzdravkov

+0

@Wintre不客氣。並感謝您提出有趣的問題。 – mobyte

+0

@Wintre FYI我已經刪除了不必要的'trim'。 – mobyte

1

這可以被分解成簡單的步驟,然後擰入一個簡單的 「一個班輪」

(->> (slurp "data")   ; read the data from the file. 
    (re-seq #"[^{} \n]+") ; split it into strings ignoring \n and { }. 
    (partition 2)   ; group it into key, value pairs 
    (map vec)    ; turn the pairs into vectors because into wants this. 
    (into {}))    ; mash them in turn into a single map. 

{":something1" "1", ":something2" "2", ":something3" "3", ":something4" "4"} 

或者,如果你喜歡的嵌套形式,你可以寫相同的代碼是這樣的:

user> (into {} (map vec (partition 2 (re-seq #"[^{} \n]+" (slurp "data"))))) 
{":something1" "1", ":something2" "2", ":something3" "3", ":something4" "4"} 
+0

在第一個解決方案中,('re-seq ...)'後面的'(分區2)'錯過了。 – mobyte

+0

我想它應該是關鍵字/數字。所以你也需要讀取值。 – mobyte

+0

哎呀,編輯中的錯誤導致該行無效,感謝您的注意 –