0

私はデータ処理を行っています。1 つのタスクは、人の分布の統計を取得することです。名前が「john doe」の場合、ca、ar、ny のさまざまな州に分類され、20 代、30 代などのさまざまな年齢層に分類されます。{1,2} または {3} は人々の ID です。

"john doe" => "ca:tw#2{1,2}:th#1{3};ar:tw#1{4}:fi#1{5};ny:tw#1{6};"

今、カリフォルニア州の tw 歳の john doe の ID を取得したい場合、どうすれば取得できますか? 多分正規表現を使用していますか?新しい ID を追加したい場合、たとえば 100 とすると、次のようになります。

"john doe" => "ca:tw#3{1,2,100}:th#1{3};ar:tw#1{4}:fi#1{5};ny:tw#1{6};"

どうすればいいですか?ありがとう!

4

2 に答える 2

1

文字列操作に固執したい場合は、正規表現とgsubを使用できます。

これを行う1つの方法があります。クリーンアップ(エラー処理、リファクタリングなど)を使用することもできますが、開始できると思います。

def count(details, location, age_group)
    location_details = /#{location}(.+?);/.match(details)[1]
    age_count = /#{age_group}#(\d+)\{/.match(details)[1]
    return age_count.to_i
end

def ids(details, location, age_group)
    location_details = /#{location}(.+?);/.match(details)[1]
    age_ids = /#{age_group}#\d+\{(.+?)\}/.match(details)[1]
    return age_ids
end

def add(details, location, age_group, new_id)
    location_details = /#{location}(.+?);/.match(details)[1]
    new_count = count(details, location, age_group) + 1
    new_ids = ids(details, location, age_group) + ',' + new_id
    location_details.gsub!(/#{age_group}#\d+\{(.+?)\}/, "#{age_group}##{new_count}{#{new_ids}}")
    details.gsub!(/#{location}(.+?);/, "#{location}#{location_details};")
end

あなたはそれがあなたが望む結果を生み出すのを見ることができます(少なくとも機能的には、パフォーマンスについてはわかりません):

names = {"john doe" => "ca:tw#2{1,2}:th#1{3};ar:tw#1{4}:fi#1{5};ny:tw#1{6};"}
puts count(names["john doe"], 'ca', 'tw')
#=> 2
puts ids(names["john doe"], 'ca', 'tw')
#=> 1,2
names["john doe"] = add(names["john doe"], 'ca', 'tw', '100')
puts names["john doe"]
#=> ca:tw#3{1,2,100}:th#1{3};ar:tw#1{4}:fi#1{5};ny:tw#1{6};
于 2012-08-15T14:18:10.977 に答える
1

プログラム内でこれに文字列を使用しても意味がありません。格納されている文字列からデータを読み取るか、そのように書き戻すことができますが、操作しやすい方法で格納する必要があります。例えば:

data = {
  "john doe" => {
    "ca" => {
      "tw" => [1,2],
      "th" => [3]
    },
    "ar" => {
       "tw" => [4],
       "fi" => [5]
    },
    "ny" => { 
       "tw" => [6]
    }
  }
}

それを考えると、20 代の California John Doe の ID はdata['john doe']['ca']['tw']. そのような John Doe の数はdata['john doe']['ca']['tw'].length; 最初の ID はdata['john doe']['ca']['tw'][0]、2 番目の ID は ですdata['john doe']['ca']['tw'][1]data['john doe']['ca']['tw'] << 100;で id 100 を追加できます。100 は の値になりますdata['john doe']['ca']['tw'][2]

ただし、私がこれを書いていたら、年齢層のキー (20、30、50) には、あいまいな文字の接頭辞ではなく、実際の数字を使用することになるでしょう。

于 2012-08-14T20:57:27.087 に答える