Ruby 如何逐行读取gzip文件?

Ruby 如何逐行读取gzip文件?,ruby,file-io,gzip,Ruby,File Io,Gzip,我有一个gzip文件,目前我是这样读的: infile = open("file.log.gz") gz = Zlib::GzipReader.new(infile) output = gz.read puts result 我认为这会将文件转换为字符串,但我希望逐行读取它 我想完成的是,该文件包含一些带有垃圾的警告消息,我想对这些警告消息进行grep处理,然后将它们写入另一个文件。但是,一些警告信息会重复出现,因此我必须确保只对它们进行一次grep。因此,逐行阅读会对我有所帮助。试试以下方法

我有一个gzip文件,目前我是这样读的:

infile = open("file.log.gz")
gz = Zlib::GzipReader.new(infile)
output = gz.read
puts result
我认为这会将文件转换为字符串,但我希望逐行读取它

我想完成的是,该文件包含一些带有垃圾的警告消息,我想对这些警告消息进行grep处理,然后将它们写入另一个文件。但是,一些警告信息会重复出现,因此我必须确保只对它们进行一次grep。因此,逐行阅读会对我有所帮助。

试试以下方法:

infile = open("file.log.gz")
gz = Zlib::GzipReader.new(infile)
while output = gz.gets
  puts output
end

您应该能够像处理常规流()一样简单地在gzip读取器上循环


其他答案显示了如何逐行读取文件,而不是如何只捕获一次错误。基于@Tigraine的答案:

require 'set'

infile = open("file.log.gz")
gz = Zlib::GzipReader.new(infile)

errors = Set.new
# or ...
# errors = [].to_set

gz.each_line do |line|
  errors << line if (line[/^Error:/])
  # or ...
  # errors << line if (line['Error:'])
end

puts errors

使用
while
是可行的,但是@Tigraine展示的
每一行在Ruby中都更惯用。我知道。我甚至想删除我的答案,但为了完整起见,我决定留下它。这是一个很好的理由。我会定期展示完成某件事的其他方法。这就是Ruby的魅力所在,我们可以用更接近于我们在其他语言中学习的风格来编写,这有助于我们作为程序员更容易访问和移植Ruby。这与Matz对开发人员透明的目标是一致的。读取完成后会自动关闭文件吗?是和否-如果GzipReader直接操作文件,您可能希望关闭它。但是在本例中,我假设
open
方法打开文件,因此您必须关闭
inline
IO流。哇!!4年过去了,仍然在回复关于你答案的评论。这就是奉献!!再次感谢。@Tigraine Getting-list\u登录失败。rb:2:未初始化常量Zlib(NameError)@AjayAradhya您可能必须
在文件中要求'Zlib'
require 'set'

infile = open("file.log.gz")
gz = Zlib::GzipReader.new(infile)

errors = Set.new
# or ...
# errors = [].to_set

gz.each_line do |line|
  errors << line if (line[/^Error:/])
  # or ...
  # errors << line if (line['Error:'])
end

puts errors
>> require 'set'
=> true
>> errors = Set.new
=> #<Set: {}>
>> errors << 'a'
=> #<Set: {"a"}>
>> errors << 'b'
=> #<Set: {"a", "b"}>
>> errors << 'a'
=> #<Set: {"a", "b"}>