Я не могу найти пакет или уже написанную функцию, которая делает это изначально в R. Хотя я думаю, что было бы относительно просто очистить справочную таблицу вики (или получить копию magic.mgc
и проанализировать ее) и использоватьreadBin
или аналогичный, я думаю, что более простой метод для кроссплатформенного использования - использовать команду file
.Единственный недостаток кроссплатформенности - в Windows, когда Rtools недоступен.
Я создал два файла с креативным именем "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
, заключается в том, что я хотел, чтобы он прерывал выполнение после успешного совпадения.