0

ファイル内の行を比較する clojure 関数を作成する必要があります。私のファイルには次のような情報が含まれています。

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

ハッシュを定義するように書かれていることがわかります。プログラムにハッシュをインポートしたいのですが、そうする前に、他の行と等しいすべての行を削除する必要があります。私のセリフはユニークである必要があります。これどうやってするの?私はいくつかのことを試しましたが、完全に失敗しました。

4

2 に答える 2

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}
于 2013-01-12T18:22:49.817 に答える
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"}
于 2013-01-12T19:38:27.250 に答える