У меня есть zipped двоичный файл в операционной системе Windows, который я пытаюсь читать с R. До сих пор он работает с использованием функции unz() в сочетании с функцией readBin().
> bin.con <- unz(zip_path, file_in_zip, open = 'rb')
> readBin(bin.con,
"double",
n = byte_chunk,
size = 8L,
endian = "little")
> close(bin.con)
Где zip_path - это путь к zip файлу, file_in_zip - это имя файла в zip файле, который должен быть прочитан, и byte_chunk - количество байтов, которое я хочу прочитать.
В моем случае использование операции readBin является частью цикла и постепенно считывает весь двоичный файл. Тем не менее, я редко хочу читать все, и часто я точно знаю, какие части я хочу читать. К сожалению, readBin не имеет аргумента start/skip, чтобы пропустить первые n байтов. Поэтому я попытался условно заменить readBin() на seek(), чтобы пропустить фактическое считывание нежелательных частей.
Когда я пытаюсь это сделать, я получаю сообщение об ошибке:
> bin.con <- unz(zip_path, file_in_zip, open = 'rb')
> seek(bin.con, where = bytes_to_skip, origin = 'current')
Error in seek.connection(bin.con, where = bytes_to_skip, origin = "current") :
seek not enabled for this connection
> close(bin.con)
До сих пор я не нашел способа решить эту ошибку. Аналогичные вопросы можно найти здесь (к сожалению, без удовлетворительного ответа):
- https://stat.ethz.ch/pipermail/r-help/2007-December/148847.html (нет ответа)
- http://r.789695.n4.nabble.com/reading-file-in-zip-archive-td4631853.html (нет ответа, но воспроизводимого примера)
Советы по всему Интернету позволяют добавить аргумент open = 'r' к unz() или вообще отказаться от открытого аргумента, но это работает только для не двоичных файлов (поскольку по умолчанию это "r" ). Люди также предлагают сначала распаковать файлы, но поскольку файлы довольно большие, это практически невозможно.
Есть ли какая-нибудь работа для поиска в двоичном сжатом файле или чтение со смещением байта (возможно, с помощью С++ через пакет Rcpp)?
Обновление
Дальнейшие исследования показывают, что seek() в zip файлах - непростая задача. Этот вопрос предлагает библиотеку С++, которая в лучшем случае может использовать грубый поиск. Этот вопрос на Python указывает, что точный поиск абсолютно невозможен из-за способа реализации zip (хотя это не противоречит методу грубого поиска).