在 R 中,查找两个文件是否不同
In R, find whether two files differ
我想要一种纯 R 方法来测试两个任意文件是否不同。因此,相当于 Unix 中的 diff -q
,但应该在 Windows 上工作并且没有外部依赖性。
我知道 tools::Rdiff
,但它似乎只想处理 R 输出文件,如果我向它提供其他内容,它会大声抱怨。
all.equal(readLines(f1), readLines(f2))
示例解决方案:
(使用来自 https://stat.ethz.ch/R-manual/R-devel/library/base/html/all.equal.html 的 all.equals 实用程序)
filenameForA <- "my_file_A.txt"
filenameForB <- "my_file_B.txt"
all.equal(readLines(filenameForA), readLines(filenameForB))
请注意,
readLines(filename)
从文件名指定的给定文件中读取所有行,
然后 all.equal 可以判断文件是否不同。
确保阅读上面的文档以充分理解。
我不得不承认,如果文件非常大,这可能不是最佳选择。
不占用内存,如果文件太大:
library(tools)
md5sum("file_1.txt") == md5sum("file_2.txt")
我知道这并不是你想要的,但我 post 为了其他 运行 想看到完整差异并愿意容忍这个问题的人的利益外部依赖。在那种情况下,diffobj
将向您展示在 windows 上运行的真实差异,其算法与 GNU 差异相同。在此示例中,我们将 Moby Dick 文本与修改了 5 行的版本进行比较:
library(diffobj)
diffFile(mob.1.txt, mob.2.txt) # or `diffChr` if you data in R already
产生:
如果你想要更快的东西,同时仍然得到差异的位置,你可以从同一个包中获得最短的编辑脚本:
ses(readLines(mob.1.txt), readLines(mob.2.txt))
# [1] "1127c1127" "2435c2435" "6417c6417" "13919c13919"
获取 Moby Dick 数据的代码(注意我没有设置种子,所以你会得到不同的行):
moby.dick.url <- 'http://www.gutenberg.org/files/2701/2701-0.txt'
moby.dick.raw <- moby.dick.UC <- readLines(moby.dick.url)
to.UC <- sample(length(moby.dick.raw), 5)
moby.dick.UC[to.UC] <- toupper(moby.dick.UC[to.UC])
mob.1.txt <- tempfile()
mob.2.txt <- tempfile()
writeLines(moby.dick.raw, mob.1.txt)
writeLines(moby.dick.UC, mob.2.txt)
最接近 unix 命令的是 diffr
- 它并排显示非常漂亮 window,所有不同的行都用颜色标记。
library(diffr)
diffr(filename1, filename2)
显示
我想要一种纯 R 方法来测试两个任意文件是否不同。因此,相当于 Unix 中的 diff -q
,但应该在 Windows 上工作并且没有外部依赖性。
我知道 tools::Rdiff
,但它似乎只想处理 R 输出文件,如果我向它提供其他内容,它会大声抱怨。
all.equal(readLines(f1), readLines(f2))
示例解决方案: (使用来自 https://stat.ethz.ch/R-manual/R-devel/library/base/html/all.equal.html 的 all.equals 实用程序)
filenameForA <- "my_file_A.txt"
filenameForB <- "my_file_B.txt"
all.equal(readLines(filenameForA), readLines(filenameForB))
请注意,
readLines(filename)
从文件名指定的给定文件中读取所有行, 然后 all.equal 可以判断文件是否不同。
确保阅读上面的文档以充分理解。 我不得不承认,如果文件非常大,这可能不是最佳选择。
不占用内存,如果文件太大:
library(tools)
md5sum("file_1.txt") == md5sum("file_2.txt")
我知道这并不是你想要的,但我 post 为了其他 运行 想看到完整差异并愿意容忍这个问题的人的利益外部依赖。在那种情况下,diffobj
将向您展示在 windows 上运行的真实差异,其算法与 GNU 差异相同。在此示例中,我们将 Moby Dick 文本与修改了 5 行的版本进行比较:
library(diffobj)
diffFile(mob.1.txt, mob.2.txt) # or `diffChr` if you data in R already
产生:
如果你想要更快的东西,同时仍然得到差异的位置,你可以从同一个包中获得最短的编辑脚本:
ses(readLines(mob.1.txt), readLines(mob.2.txt))
# [1] "1127c1127" "2435c2435" "6417c6417" "13919c13919"
获取 Moby Dick 数据的代码(注意我没有设置种子,所以你会得到不同的行):
moby.dick.url <- 'http://www.gutenberg.org/files/2701/2701-0.txt'
moby.dick.raw <- moby.dick.UC <- readLines(moby.dick.url)
to.UC <- sample(length(moby.dick.raw), 5)
moby.dick.UC[to.UC] <- toupper(moby.dick.UC[to.UC])
mob.1.txt <- tempfile()
mob.2.txt <- tempfile()
writeLines(moby.dick.raw, mob.1.txt)
writeLines(moby.dick.UC, mob.2.txt)
最接近 unix 命令的是 diffr
- 它并排显示非常漂亮 window,所有不同的行都用颜色标记。
library(diffr)
diffr(filename1, filename2)
显示