Ruby:如何从文件或STDIN中读取gzip数据?

时间:2011-05-22 08:16:55

标签: ruby gzip stdin

我想从输入文件或STDIN读取数据 - 输入数据可能是gzip压缩。

对于文件,这可以使用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中的gzip压缩数据,但常规数据的结果如下:

./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 个答案:

答案 0 :(得分:1)

将数据从STDIN加载到临时文件中,然后再解析它

require 'tempfile'

tf = Tempfile.new('tmp')

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

tf.rewind