我想从输入文件或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中的数据是否已压缩?
干杯,
马丁
答案 0 :(得分:1)
将数据从STDIN加载到临时文件中,然后再解析它
require 'tempfile'
tf = Tempfile.new('tmp')
while $stdin.gets do
tf.puts $_
end
tf.rewind