我想用纯R方式来测试两个任意文件是否不同。因此,相当于Unix中的diff -q
,但应该在Windows上工作,没有外部依赖。
我知道tools::Rdiff
,但它似乎只想处理R输出文件,并且如果我把它输入其他内容就会大声抱怨。
答案 0 :(得分:14)
不使用内存,如果文件太大:
library(tools)
md5sum("file_1.txt") == md5sum("file_2.txt")
答案 1 :(得分:4)
我意识到这并不是你所要求的,但我发布它是为了让其他人遇到想要看到完全差异并愿意容忍外部依赖的问题。在这种情况下, diffobj
将使用与GNU差异相同的算法向您显示适用于Windows的真实差异。在这个例子中,我们将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)
答案 2 :(得分:2)
示例解决方案: (使用来自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)
从filename指定的给定文件中读取所有行, 然后all.equal可以判断文件是否不同。
请务必阅读上述文档,以便充分了解。 我承认,如果文件非常大,这可能不是最佳选择。
答案 3 :(得分:1)
答案 4 :(得分:0)
all.equal(readLines(f1), readLines(f2))