0

我正在做数据处理,一项任务是获取人员分布的统计信息。比如说名字为“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 在 ca 的 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

在程序中为此使用字符串是没有意义的。您可以在存储字符串时从字符串中读取数据,或者以这种方式将其写回,但您应该以易于操作的方式存储它。例如:

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

鉴于此,20 多岁的加利福尼亚 John Doe 的 id 为data['john doe']['ca']['tw']. 这种 John Doe 的数量是data['john doe']['ca']['tw'].length; 第一个 id 是data['john doe']['ca']['tw'][0],第二个是data['john doe']['ca']['tw'][1]。您可以使用 ; 添加 id 100 到它data['john doe']['ca']['tw'] << 100。100 将是 的值data['john doe']['ca']['tw'][2]

但是,如果我正在写这篇文章,我可能会使用实际数字作为年龄范围键(20、30、50),而不是那些晦涩的字母前缀。

于 2012-08-14T20:57:27.087 回答
1

如果你想坚持字符串操作,你可以使用正则表达式和 gsub。

这是一种方法。它可以使用一些清理(例如错误处理、重构等),但我认为它会让你开始。

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 回答