File Clojure比较文件中的行

File Clojure比较文件中的行,file,hash,clojure,compare,lines,File,Hash,Clojure,Compare,Lines,我必须编写一个clojure函数,用于比较文件中的行。 我的文件包含以下信息: {:something1 1 :something2 2 :something2 2 :something3 3 :something4 4 :something4 4 } user> (into {} (map vec (partition 2 (re-seq #"[^{} \n]+" (slurp "data"))))) {":something1" "1", ":

我必须编写一个clojure函数,用于比较文件中的行。 我的文件包含以下信息:

{:something1 1
    :something2 2
    :something2 2
    :something3 3
    :something4 4
    :something4 4
}
user> (into {} (map vec (partition 2 (re-seq #"[^{} \n]+" (slurp "data")))))
{":something1" "1", ":something2" "2", ":something3" "3", ":something4" "4"}
您可以看到它是为了定义散列而编写的。我想在我的程序中导入散列,但在此之前,我需要删除与其他行相等的每一行。我的台词必须是独一无二的。我该怎么做? 我尝试了几件事,但都失败了

(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}

这可以分解为更简单的步骤,然后拧入一个简单的“单衬套”

或者,如果您更喜欢嵌套表单,可以编写如下相同的代码:

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

您的输入是否包含重复的键、重复的值或两者都包含?谢谢,您是我的英雄。:)@温特,不客气。谢谢你提出的有趣问题。@Wintre仅供参考,我删除了不必要的
修剪
。在第一个解决方案中,你错过了
(分区2)
之后的
(重新排序…
。我想应该是关键字/数字。所以你也需要
阅读
值。哎呀,编辑错误删除了那一行,谢谢你的注意