我想检测对象的文件类型,以确定压缩文件的正确连接(例如,是否使用bzfile
gzfile
,xzfile
等。显然我可以根据文件扩展名“猜测”,但我的理解是检查magic number会更加健壮(虽然我有点不清楚它是否可移植到基于Windows的架构?)
如何返回文件的幻数以确定它是否确实是BZh
?
请注意,我想要一个适合在包开发中使用的解决方案;例如将尽可能在操作系统之间移植,而不是特定于* nix系统。
答案 0 :(得分:2)
Github上有几个软件包以某种方式使用libmagic:
file.exe
并在Windows上使用来自Rtools的magic.mgc
。libmagic
的子集的解决方案。libmagic
并在Windows上编译"America/New_York"
(c.f。https://github.com/daqana/dqmagic/tree/windows)答案 1 :(得分:1)
我找不到已经编写过在R中本地执行此操作的包或函数。虽然我认为刮取wiki引用表(或获取magic.mgc
的副本并解析它)相对简单直接并且使用readBin
或类似的,我认为跨平台使用的更直接的方法是使用file
命令。当Rtools不可用时,唯一缺乏跨平台的是Windows。
我创建了两个文件,创造性地命名为" gz"和" bz2",并运行此测试。
ptns <- list(gzip="gzip compressed data",
bzip2="bzip2 compressed data",
pdf15="PDF document, version 1.5",
xlsx="Microsoft Excel")
files <- c("gz", "bz2")
out <- system2("file", args=files, stdout=TRUE)
setNames(sapply(out, function(o) {
thistype <- "unk"
for (j in seq_along(ptns)) {
if (grepl(ptns[[j]], o)) {
thistype <- names(ptns)[j]
break
}
}
thistype
}), files)
# gz bz2
# "gzip" "bzip2"
我在内部选择for
循环的原因是我希望它在成功匹配后中断执行。