Как проверить магический номер файла (или шестнадцатеричную подпись) в R? - PullRequest
0 голосов
/ 10 июня 2018

Я хотел бы определить тип файла объекта, чтобы определить правильное соединение для сжатого файла (например, использовать ли bzfile gzfile, xzfile и т. Д. Очевидно, что я мог бы "угадать" на основена расширение файла, но я понимаю, что проверка магическое число будет более надежным (хотя я немного не уверен, что это переносимо для архитектур на базе Windows?)

Какя могу вернуть магический номер файла, чтобы определить, действительно ли он, скажем, BZh?

Обратите внимание, что мне нужно решение, которое подходит для использования в разработке пакетов, например будетвозможно переносить между операционными системами и не относится только к * nix системам.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

На Github есть несколько пакетов, которые так или иначе используют libmagic:

0 голосов
/ 10 июня 2018

Я не могу найти пакет или уже написанную функцию, которая делает это изначально в 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, заключается в том, что я хотел, чтобы он прерывал выполнение после успешного совпадения.

...