Разобрать лог-файл в массив хэшей - PullRequest
2 голосов
/ 12 января 2011

Я хочу проанализировать файл журнала, который имеет 3 записи. Это выглядит так:

Start: foo
Parameters: foo
End: foo

Start: other foo
Parameters: other foo
End: other foo

....

Фу это то, что я хочу. Было бы неплохо, если бы результат выглядел так:

logs = [
{
  :start=>"foo",
  :parameters=>"foo",
  :end=>"foo"
},
{
  :start=>"other foo",
  :parameters=>"other foo",
  :end=>"other foo"
}
]

Я знаю некоторые регулярные выражения, но мне трудно понять, как я это делаю в нескольких строках. Спасибо!

Ответы [ 3 ]

5 голосов
/ 12 января 2011

Лучший способ сделать это с помощью многострочного регулярного выражения:

logs = file.scan /^Start: (.*)\nParameters: (.*)$\nEnd: (.*)$/
#  => [["foo", "foo", "foo"], ["other foo", "other foo", "other foo"]]
logs.map! { |s,p,e|  { :start => s, :parameters => p, :end => e } }
#  => [ {:start => "foo", :parameters => "foo", :end => "foo" }, ... ]
4 голосов
/ 12 января 2011
#!/usr/bin/ruby1.8

require 'pp'

logfile = <<EOS
Start: foo
Parameters: foo
End: foo

Start: other foo
Parameters: other foo
End: other foo
EOS

logs = logfile.split(/\n\n/).map do |section|
  Hash[section.lines.map do |line|
    key, value = line.chomp.split(/: /)
    [key.downcase.to_sym, value]
  end]
end

pp logs
# => [{:end=>"foo", :parameters=>"foo", :start=>"foo"},
# =>  {:end=>"other foo", :parameters=>"other foo", :start=>"other foo"}]
3 голосов
/ 12 января 2011

Может быть проблемой прочитать весь лог-файл в память, как это делает Уэйн.

log = []
h = {}
FasterCSV.foreach("log.log", :col_sep => ":") do |row|
  name, value = *row
  if !name.nil?
    h[name.downcase.to_sym]=value
    if name=="End"
      log<<h
      h={}
    end
  end
end

log
=> [{:end=>" foo", :start=>" foo", :parameters=>" foo"},
    {:end=>" other foo", :start=>" other foo", :parameters=>" other foo"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...