Другие ответы показывают, как читать файл построчно, а не как фиксировать ошибки только один раз.Опираясь на ответ @ 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
Set действует как Array, но построен с использованием Hash, так что это похоже на Hash, но нас интересуют только ключи, т.е. сохраняются только уникальные значения.Если вы попытаетесь добавить дубликаты, они будут выброшены, и у вас останутся только уникальные значения.Вы можете использовать массив, а затем использовать uniq
на нем, но набор будет управлять им заранее.
>> require 'set'
=> true
>> errors = Set.new
=> #<Set: {}>
>> errors << 'a'
=> #<Set: {"a"}>
>> errors << 'b'
=> #<Set: {"a", "b"}>
>> errors << 'a'
=> #<Set: {"a", "b"}>