2017-10-12 14 views
0
私のテキストファイルは、私が投票キャンペーンの有効性の選択の値を取得したいこの

はRubyでテキストファイルを解析

VOTE 1168041805 Campaign:ssss_uk_01B Validity:during Choice:Antony CONN:MIG01TU MSISDN:00777778359999 GUID:E6109CA1-7756-45DC-8EE7-677CA7C3D7F3 Shortcode:63334 
VOTE 1168041837 Campaign:ssss_uk_01B Validity:during Choice:Leon CONN:MIG00VU MSISDN:00777770939999 GUID:88B52A7B-A182-405C-9AE6-36FCF2E47294 Shortcode:63334 

のように見える

は、そのため私はこれをやっている:

 File.foreach('lib/data/file.txt') do |line| 
     line = line.tidy_bytes 
     begin 
     aline = line.match(/^VOTE\s(\d+)\sCampaign:([^ ]+)\sValidity:([^ ]+)\sChoice:([^ ]+)/) 
     unless aline.nil? 
      ## do something 
     end 
     rescue Exception => e 
     raise " error: " + e.inspect 
     p line.inspect 
     next 
     end 
    end 

があるが、任意のより良いです[2]アリーンを

 aline = line.match(/^VOTE\s(\d+)\sCampaign:([^ ]+)\sValidity:([^ ]+)\sChoice:([^ ]+)/) 

のためにこれをやってアリーン[1]アリーンを取得するための方法、[3]とアリーン[4]

+0

は '使用することを忘れないでください\ Rubyの '^'と '$'の代わりに 'A'と' \ z'をそれぞれ "文字列の始まり"と "終りの文字列"を意味します。 2番目の形式は、 "行頭"と "行末"を意味するために使用され、予想以上に大きな結果をもたらす可能性があります。 – tadman

答えて

1

あなたは代わりに、結果のハッシュを取得するためにnamed capturesを使用することができます。

# use a freezed contant instead of making a new Regexp object for each line 
REGEXP = /^VOTE\s(?<id>\d+)\sCampaign:(?<campaign>[^ ]+)\sValidity:(?<validity>[^ ]+)\sChoice:(?<choice>[^ ]+)/.freeze 

File.foreach('lib/data/file.txt') do |line| 
    begin 
     matches = line.tidy_bytes.match(REGEXP) 
     hash = matches.names.zip(matches.captures).to_h 
    end 
    rescue Exception => e 
    raise " error: " + e.inspect 
    p line.inspect 
    next 
    end 
end 

所望の結果は、あなたが.mapを使用する場合があります配列の場合:

# use a freezed contant instead of making a new Regexp object for each line 
REGEXP = /^VOTE\s(?<id>\d+)\sCampaign:(?<campaign>[^ ]+)\sValidity:(?<validity>[^ ]+)\sChoice:(?<choice>[^ ]+)/.freeze 

results = File.foreach('lib/data/file.txt').map do |line| 
    matches = line.tidy_bytes.match(REGEXP) 
    matches.names.zip(matches.captures).to_h 
end 
+0

救助していない側で例外は巨大な反パターンです。それはNoMethodErrorのようなものを救助するので、バグを飲み込むでしょう。あなたは何をするべきかを知っている特定の例外を救いなさい。 – max