Вызов File.readlines (или эквивалент) для архивированных файлов БЕЗ их предварительного разархивирования

#ruby #gzip

#ruby #gzip

Вопрос:

Я пытаюсь написать задачу rake для сканирования некоторых архивированных файлов журналов и извлечения некоторых данных, которые я затем могу использовать для обновления некоторых записей базы данных. Из-за ограничений пространства на нашем сервере я не могу разархивировать все файлы и просто вызвать File.readlines для них, что я обычно и делаю.

Может ли кто-нибудь предложить альтернативный подход, который не требует разархивирования файлов? Что мне нужно сделать, это в основном сканировать строки, соответствующие определенному регулярному выражению, затем извлечь некоторый текст из строки ПОСЛЕ соответствующей строки. Все они находятся в архиве и, следовательно, являются файлами .gz.

Комментарии:

1. По сути, вы хотите сопоставить сжатые данные с текстом, не распаковывая их?

Ответ №1:

Вы можете открыть архивированный файл с помощью Ruby и выполнить поиск, как если бы вы открыли файл в обычном режиме, вот так:

 require 'zlib'

Zlib::GzipReader.open("myfile.gz") { |gz|
  # place your code here, something like:
  p gz.readlines.grep /my-magic-marker/
}
  

Это загрузит весь файл в память, остерегайтесь этого.