其他的答案顯示瞭如何讀取文件中的行做而不是如何只捕捉一次錯誤。建立在@ 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