Ruby: Как прочитать, может быть, сжатые данные из файла или STDIN? - PullRequest
3 голосов
/ 22 мая 2011

Я хотел бы прочитать данные из входного файла или STDIN - входные данные могут быть сжаты.

Для файлов это можно сделать с помощью Zlib :: GzipReader, например:

require 'zlib'

ios = File.open(file, mode='r')

begin
  ios = Zlib::GzipReader.new(ios)
rescue
  ios.rewind
end

ios.each_line { |line| puts line }

Однако мне не удается правильно определить сжатые данные из STDIN:

require 'zlib'

if STDIN.tty?
  # do nothing
else
  ios = STDIN

  begin
    ios = Zlib::GzipReader.new(ios)
  rescue
    ios.rewind
  end
end

ios.each_line { |line| puts line }

Вышеописанное работает с сжатыми данными в STDIN, но обычные данные приводят к следующему:

./test.rb:14:in `rewind': Illegal seek - <STDIN> (Errno::ESPIPE)
        from ./test.rb:14:in `rescue in <main>'
        from ./test.rb:11:in `<main>'

Итак, если я не могу перемотать STDIN, как мне проверить, сжаты ли данные в STDIN или нет?

Приветствия,

Мартин

1 Ответ

1 голос
/ 22 мая 2011

Загрузить данные из STDIN во временный файл и только потом анализировать их

require 'tempfile'

tf = Tempfile.new('tmp')

while $stdin.gets do
   tf.puts $_
end

tf.rewind
...