[英]How do I check a file's magic number (or hex signature) in R?
我想检测对象的文件类型,以便确定压缩文件的正确连接(例如,是否使用bzfile
gzfile
, xzfile
等。显然,我可以基于文件扩展名“猜测”,但是我的理解是检查幻数会更健壮(尽管我不清楚这是否可移植到基于Windows的体系结构?)
我如何返回文件的幻数以确定它是否确实是BZh
?
请注意,我想要一个适用于程序包开发的解决方案。 例如,它将尽可能地跨操作系统移植,而不是特定于* nix系统。
Github上有几个通过某种方式使用libmagic的软件包:
libmagic
,并在Windows上使用file.exe
的file.exe。 magic.mgc
的子集的R解决方案。 libmagic
并在Windows上编译libmagic
(cf https://github.com/daqana/dqmagic/tree/windows ) 我找不到已经在R magic.mgc
执行此操作的程序包或函数。尽管我认为抓取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
循环的原因是,一旦成功匹配,我希望它中断执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.