Filter 筛选Clojure中两个文本文件之间的匹配字符串
文本文件具有具有不同前缀的路径列表 假设before.txt如下所示:Filter 筛选Clojure中两个文本文件之间的匹配字符串,filter,clojure,compare,Filter,Clojure,Compare,文本文件具有具有不同前缀的路径列表 假设before.txt如下所示: before/pictures/img1.jpeg before/pictures/img2.jpeg before/pictures/img3.jpeg after/pictures/img1.jpeg after/pictures/img3.jpeg after.txt如下所示: before/pictures/img1.jpeg before/pictures/img2.jpeg before/pictures/i
before/pictures/img1.jpeg
before/pictures/img2.jpeg
before/pictures/img3.jpeg
after/pictures/img1.jpeg
after/pictures/img3.jpeg
after.txt如下所示:
before/pictures/img1.jpeg
before/pictures/img2.jpeg
before/pictures/img3.jpeg
after/pictures/img1.jpeg
after/pictures/img3.jpeg
函数deleted files应删除不同的前缀(before、after),并比较这两个文件以打印after.txt的缺失列表
迄今为止的代码:
(ns dirdiff.core
(:gen-class))
(defn deleted-files [prefix-file1 prefix-file2 file1 file2]
(let [before (slurp "resources/davor.txt")
(let [after (slurp "resources/danach.txt")
)
预期输出:哪个是被删除的
/pictures/img2.jpeg
如何过滤clojure.clj中的列表以仅显示缺失的列表?以下是我的处理方法,从以下几点开始: 以及一个单元测试,以显示它的作用:
(dotest
(let [before-files "before/pictures/img1.jpeg
before/pictures/img2.jpeg
before/pictures/img3.jpeg "
after-files "after/pictures/img1.jpeg
after/pictures/img3.jpeg "
before-prefix "before"
after-prefix "after"]
(is= (delta-files before-files after-files before-prefix after-prefix)
["/pictures/img2.jpeg"])
))
一定要学习这些知识,包括获取Clojure和Clojure备忘表等书籍
注: 我喜欢用
let spy
和let spy pretty
来说明代码的进程。它产生如下输出:
-------------------------------
Clojure 1.10.2 Java 15
-------------------------------
Testing tst.demo.core
before-files => ["/pictures/img1.jpeg" "/pictures/img2.jpeg" "/pictures/img3.jpeg"]
after-files => ["/pictures/img1.jpeg" "/pictures/img3.jpeg"]
before-files-set => #{"/pictures/img3.jpeg" "/pictures/img2.jpeg" "/pictures/img1.jpeg"}
after-files-set => #{"/pictures/img3.jpeg" "/pictures/img1.jpeg"}
delta-sorted => ["/pictures/img2.jpeg"]
Ran 2 tests containing 1 assertions.
0 failures, 0 errors.
spyx
宏对于调试也非常有用。请参见和。以下是我将如何处理它,从以下几点开始:
以及一个单元测试,以显示它的作用:
(dotest
(let [before-files "before/pictures/img1.jpeg
before/pictures/img2.jpeg
before/pictures/img3.jpeg "
after-files "after/pictures/img1.jpeg
after/pictures/img3.jpeg "
before-prefix "before"
after-prefix "after"]
(is= (delta-files before-files after-files before-prefix after-prefix)
["/pictures/img2.jpeg"])
))
一定要学习这些知识,包括获取Clojure和Clojure备忘表等书籍
注: 我喜欢用
let spy
和let spy pretty
来说明代码的进程。它产生如下输出:
-------------------------------
Clojure 1.10.2 Java 15
-------------------------------
Testing tst.demo.core
before-files => ["/pictures/img1.jpeg" "/pictures/img2.jpeg" "/pictures/img3.jpeg"]
after-files => ["/pictures/img1.jpeg" "/pictures/img3.jpeg"]
before-files-set => #{"/pictures/img3.jpeg" "/pictures/img2.jpeg" "/pictures/img1.jpeg"}
after-files-set => #{"/pictures/img3.jpeg" "/pictures/img1.jpeg"}
delta-sorted => ["/pictures/img2.jpeg"]
Ran 2 tests containing 1 assertions.
0 failures, 0 errors.
spyx
宏对于调试也非常有用。请参阅和。删除前缀后,可能需要计算两组文件名之间的集差:
(defn deprefixing [prefix]
(comp (filter #(clojure.string/starts-with? % prefix))
(map #(subs % (count prefix)))))
(defn load-string-set [xf filename]
(->> filename
slurp
clojure.string/split-lines
(into #{} xf)))
(defn deleted-files [prefix-file1 prefix-file2 file1 file2]
(clojure.set/difference (load-string-set (deprefixing prefix-file1) file1)
(load-string-set (deprefixing prefix-file2) file2)))
(deleted-files "before" "after"
"/tmp/before.txt" "/tmp/after.txt")
;; => #{"/pictures/img2.jpeg"}
您可能希望在删除前缀后计算两组文件名之间的集差:
(defn deprefixing [prefix]
(comp (filter #(clojure.string/starts-with? % prefix))
(map #(subs % (count prefix)))))
(defn load-string-set [xf filename]
(->> filename
slurp
clojure.string/split-lines
(into #{} xf)))
(defn deleted-files [prefix-file1 prefix-file2 file1 file2]
(clojure.set/difference (load-string-set (deprefixing prefix-file1) file1)
(load-string-set (deprefixing prefix-file2) file2)))
(deleted-files "before" "after"
"/tmp/before.txt" "/tmp/after.txt")
;; => #{"/pictures/img2.jpeg"}
请添加您尝试过的代码以及失败的原因(例如错误、堆栈跟踪、日志等),以便我们对其进行改进。如果您正在寻找想法,如何开始,请查看
clojure.data/diff
或clojure.set
。请编辑您的问题,并告诉我们您对给定数据的预期结果。请添加您尝试过的代码以及失败的原因(例如错误、堆栈跟踪、日志等),以便我们对其进行改进。如果您正在寻找想法,如何开始,请查看clojure.data/diff
或clojure.set
。请编辑您的问题,并告诉我们您对给定数据的预期结果。