2011-01-12 3 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

나는 캠의 대답이 나의 것보다 우수하다고 생각한다. 동의하면 대신 체크 표시를 해주시겠습니까? 감사! –

답변

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

웨인하는 것처럼 메모리에 전체 로그 파일을 읽을 수 문제가 될 수 있습니다.

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"}] 
관련 문제