2017-06-06 11 views
0

にそれを挿入し、私のようなものに見えるモデルがあります:JSONとしてmetricsフィールドでルビーon Railsの:ハッシュ文字列に分割して、JSON

:created_at => Tue, 06 Jun 2017 15:34:32 UTC +00:00, 
    :updated_at => Tue, 06 Jun 2017 15:34:35 UTC +00:00, 
    :metrics => { 
       "metric_a" => 10756, 
       "metric_b" => "", 
       "metric_c" => 6.67267607666759 
}, 
    :status => "working" 

を。

そして、私は、次のような文字列を分割したい:各カテゴリは二つの数字、それを次の割合と数を保持するようにmetricsフィールドの下にcategories名前を付ける

"Home/Personal Finance=37.00%=55,Computers/Internet/Web Design and Development=13.77%=48,News=8.64%=45,Arts/Television=5.23%=42,Arts/Music=2.99%=39,News/Current Events=2.66%=38,Society/Issues=2.47%=38,Computers/Internet/On the Web=2.46%=38,Business/Investing=1.76%=36,Society=1.70%=36" 

を。基本的に私は(?多分道でそれらを格納するためのより良い方法があります)カテゴリごとに2つの数値を保存したい

:created_at => Tue, 06 Jun 2017 15:34:32 UTC +00:00, 
    :updated_at => Tue, 06 Jun 2017 15:34:35 UTC +00:00, 
    :metrics => { 
       "metric_a" => 10756, 
       "metric_b" => "", 
       "metric_c" => 6.67267607666759 
       "categories" => { 
      "Home/Personal Finance": [37.00,55], 
      "Computers/Internet/Web Design and Development": [13.77,48], 
      ... 
      } 

}, 
    :status => "working" 

: は、だから、上記の例では次のようになります。

どちらの方法でも、文字列を.split(",")で分割することはできますが、次に何をするのですか?

答えて

0

あなたの文字列の構造は常に同じである場合、あなたは"categories"ハッシュを取得するには、このような何かを行うことができます:

str = "Home/Personal Finance=37.00%=55,Computers/Internet/Web Design and Development=13.77%=48,News=8.64%=45,Arts/Television=5.23%=42,Arts/Music=2.99%=39,News/Current Events=2.66%=38,Society/Issues=2.47%=38,Computers/Internet/On the Web=2.46%=38,Business/Investing=1.76%=36,Society=1.70%=36" 

str.split(",").each_with_object({}) do |line, categories| 
    items = line.split("=") 
    categories[items[0]] = [items[1].gsub("%", "").to_f, items[2].to_i] 
end 

出力:

{ 
    "Home/Personal Finance"=>[37.0, 55], 
    "Computers/Internet/Web Design and Development"=>[13.77, 48], 
    "News"=>[8.64, 45], 
    "Arts/Television"=>[5.23, 42], 
    "Arts/Music"=>[2.99, 39], 
    "News/Current Events"=>[2.66, 38], 
    "Society/Issues"=>[2.47, 38], 
    "Computers/Internet/On the Web"=>[2.46, 38], 
    "Business/Investing"=>[1.76, 36], 
    "Society"=>[1.7, 36] 
} 
+0

'each_with_object'、それは良いことです!私はそのことを勉強しなければならないだろう。ちょっと、 'split_line.split( '=')。tap do | line_parts |'で行ったのは、 'items = line.split(" = ")'の割り当てを避けようとしていたからです。なぜ私がそれを避けようとしていたのか、正当な理由はありません。あなたは譲渡の賛否両論について意見がありますか?申し訳ありませんが、それはばかな質問です。 – jvillian

+1

@jvillianそれも良いですし、より慣れているようです。実際、私はその種の課題も好きではない(正当な理由もない)ので、私はそれらを避けようとします。この場合、コード1の行を短くし、読みやすくすることは間違いありません。 – Gerry

0

ダン、ジェリー、あなたがしています良い!

私が言おうとした

str.split(',').inject({}) do |to_return, split_line| 
    split_line.split('=').tap do |line_parts| 
     to_return[line_parts[0]] = [line_parts[1].gsub('%','').to_f,line_parts[2].to_i] 
    end 
    to_return 
    end 

出力:

{ 
    "Home/Personal Finance"=>[37.0, 55], 
    "Computers/Internet/Web Design and Development"=>[13.77, 48], 
    "News"=>[8.64, 45], 
    "Arts/Television"=>[5.23, 42], 
    "Arts/Music"=>[2.99, 39], 
    "News/Current Events"=>[2.66, 38], 
    "Society/Issues"=>[2.47, 38], 
    "Computers/Internet/On the Web"=>[2.46, 38], 
    "Business/Investing"=>[1.76, 36], 
    "Society"=>[1.7, 36] 
    } 

をしかし、いつものように、あなたはクリーナーです。まだ勉強してる!

+0

ありがとう(ちょうど学ぶ)!それはもっと洗練されているかもしれませんが、あなたはOPが求めている正確な出力を得ています( '%'をきれいにする必要があります)。 – Gerry

0

あなたはこのために正規表現を使用するか、またはこのようなものでした:

str="Home/Personal Finance=37.00%=55,Computers/Internet/Web Design and Development=13.77%=48,News=8.64%=45,Arts/Television=5.23%=42,Arts/Music=2.99%=39,News/Current Events=2.66%=38,Society/Issues=2.47%=38,Computers/Internet/On the Web=2.46%=38,Business/Investing=1.76%=36,Society=1.70%=36" 

categories = {} 

str = str.split(',').each do |category| 

    parts = category.split('=') 

    # Parts: 
    # 0: Home/Personal Finance 
    # 1: 37.00% 
    # 2: 55 

    key = parts[0] 
    first_number = Float(parts[1].gsub('%', '')) 
    last_number = parts[2].to_i 

    categories[key] = [first_number, last_number] 

end 
+0

ねえ、そこに!あなたは正規表現がどこにあるのかを指摘できますか? – jvillian

+0

私の例では正規表現はありません!私はそれらに悪いxD – muZk

+0

ああ、私はあなたのオープニングを誤解しました。ごめんなさい! – jvillian

0

正規表現はここで良いオプションです。あなたのカテゴリ名が文字として=%または,を持っていないことを想定すると、あなたが行うことができます:

categories_string = "Home/Personal Finance=37.00%=55,Computers/Internet/Web Design and Development=13.77%=48,News=8.64%=45,Arts/Television=5.23%=42,Arts/Music=2.99%=39,News/Current Events=2.66%=38,Society/Issues=2.47%=38,Computers/Internet/On the Web=2.46%=38,Business/Investing=1.76%=36,Society=1.70%=36" 

categories_string.scan(/(.+?)=(.+?)%=(.+?),/).map do |x,y,z| 
    { x => [y.to_f, z.to_i] } 
end.reduce Hash.new, :merge 

#=> {"Home/Personal Finance"=>[37.0, 55], "Computers/Internet/Web Design and Development"=>[13.77, 48], "News"=>[8.64, 45], "Arts/Television"=>[5.23, 42], "Arts/Music"=>[2.99, 39], "News/Current Events"=>[2.66, 38], "Society/Issues"=>[2.47, 38], "Computers/Internet/On the Web"=>[2.46, 38], "Business/Investing"=>[1.76, 36]} 
関連する問題