Filter 筛选Clojure中两个文本文件之间的匹配字符串

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.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/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"])
    ))
一定要学习这些知识,包括获取ClojureClojure备忘表等书籍


注:

我喜欢用
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"])
    ))
一定要学习这些知识,包括获取ClojureClojure备忘表等书籍


注:

我喜欢用
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
。请编辑您的问题,并告诉我们您对给定数据的预期结果。