2011-01-12 8 views
2

3つのエントリを持つログファイルを解析します。これは次のようになります。カスタムログファイルをハッシュの配列にパーズします

Start: foo 
Parameters: foo 
End: foo 

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

.... 

fooは私が望むものです。

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

私はいくつかの正規表現を知っているが、私は複数行にわたりこれにどのように私を理解することは難しい。結果はこのように見える場合、それはいいだろう。 ありがとう!

+0

私は@ camの答えが私より優れていると思います。あなたが同意するならば、その代わりにチェックマークを付けてください。ありがとう! –

答えて

4
#!/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"}] 
5

これを行うための最善の方法は、複数行の正規表現である:

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" }, ... ] 
+0

ああ、私よりはるかに良い。 –

3

ウェインが行うようにメモリに全体のログファイルを読み取るために問題がある可能性があります。

関連する問題