其他的答案显示了如何读取文件中的行做而不是如何只捕捉一次错误。建立在@ 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
设置的行为像数组,但使用Hash建成,所以它就像一个哈希但我们只关心键,即唯一的值存储。如果您尝试添加重复项,则它们将被丢弃,仅留下唯一的值。你可以使用一个数组,然后使用uniq
,但是一个Set会在你前面管理它。
>> require 'set'
=> true
>> errors = Set.new
=> #<Set: {}>
>> errors << 'a'
=> #<Set: {"a"}>
>> errors << 'b'
=> #<Set: {"a", "b"}>
>> errors << 'a'
=> #<Set: {"a", "b"}>
这会在阅读完成后自动关闭文件吗? – Rohit 2015-08-14 20:49:10
是,否 - 如果GzipReader直接在文件上运行,您可能需要关闭它。但在这种情况下,我假定'open'方法打开文件,因此您必须关闭'inline' IO流。 – Tigraine 2015-08-24 08:21:00
哇! 4年后,仍然回复对你的回答的评论。 现在,这是奉献! 再次感谢。 – Rohit 2015-08-25 04:47:27