在R中,查找两个文件是否不同

9 diff r

我想用一种纯粹的R方式来测试两个任意文件是否不同.所以,相当于diff -q在Unix中,但应该在Windows上工作,没有外部依赖.

我知道tools::Rdiff,但它似乎只想处理R输出文件,并且如果我用其他东西喂它就会大声抱怨.

thc*_*thc 19

不使用内存,如果文件太大:

library(tools)
md5sum("file_1.txt") == md5sum("file_2.txt")
Run Code Online (Sandbox Code Playgroud)


Agi*_*ean 12

最接近 unix 命令的是diffr- 它显示了一个非常漂亮的并排窗口,所有不同的行都用颜色标记。

library(diffr)
diffr(filename1, filename2)
Run Code Online (Sandbox Code Playgroud)

显示

在此处输入图片说明


Bro*_*ieG 6

我意识到这并不完全是您所要的,但是我将其发布是为了让遇到此问题的其他人受益,他们希望看到完整的差异并愿意容忍外部依赖性。在这种情况下,diffobj将使用适用于Windows的真实差异向您展示它们,并使用与GNU差异相同的算法。在此示例中,我们将Moby Dick文本与修改了5行的文本版本进行比较:

library(diffobj)
diffFile(mob.1.txt, mob.2.txt)   # or `diffChr` if you data in R already
Run Code Online (Sandbox Code Playgroud)

产生:

在此处输入图片说明

如果您想更快地获得东西,同时又能找到差异的位置,则可以从同一软件包中获得最短的编辑脚本:

ses(readLines(mob.1.txt), readLines(mob.2.txt))
# [1] "1127c1127"   "2435c2435"   "6417c6417"   "13919c13919"
Run Code Online (Sandbox Code Playgroud)

获取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)
Run Code Online (Sandbox Code Playgroud)