Ruby:如何从文件或 STDIN 读取可能是 gzip 压缩的数据?
我想从输入文件或 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 中的数据是否被压缩?
干杯,
马丁
I would like to read data from an input file or STDIN - the input data may be gzipped.
For files this can be done with Zlib::GzipReader like this:
require 'zlib'
ios = File.open(file, mode='r')
begin
ios = Zlib::GzipReader.new(ios)
rescue
ios.rewind
end
ios.each_line { |line| puts line }
However, I fail to get the detection of zipped data from STDIN right:
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 }
The above works with gzipped data in STDIN, but regular data results in this:
./test.rb:14:in `rewind': Illegal seek - <STDIN> (Errno::ESPIPE)
from ./test.rb:14:in `rescue in <main>'
from ./test.rb:11:in `<main>'
So, if I cannot rewind STDIN, how do I test if data in STDIN is zipped or not?
Cheers,
Martin
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
将数据从 STDIN 加载到临时文件中,然后才解析它
Load data from STDIN into temporary file and only then parse it