2013-04-17 2 views
0
String = "Mod1:10022932,10828075,5946410,13321905,5491120,5030731|Mod2:22704455,22991440,22991464,21984312,21777721,21777723,21889761,21939852,23091478,22339903,23091485,22099714,21998260,22364832,21939858,21944274,21944226,22800221,22704443,21777728,21777719,21678184,21998265,21834900,21984331,22704454,21998261,21944214,21862610,21836482|Mod3:10828075,13321905,5491120,5946410,5030731,15806212,4100566,4787137,2625339,2408317,2646868,19612047,2646862,11983534,8591489,19612048,10249319,14220471,15806209,13330887,15075124,17656842,3056657,5086273|Mod4:10828075,5946410,13321905,5030731,5491120,4787137,4100566,15806212,2625339,3542205,2408317,2646862,2646868|Mod5:10022932;0.2512,10828075;0.2093,5030731;0.1465,5946410;0.1465,4787137;0.1465,2625339;0.0143,5491120;0.0143,13321905;0.0143,3542205;0.0143,15806212;0.0119,4100566;0.0119,19612047;0.0100,2408317;0.0100" 

Как можно разделить его так, чтобы я мог получить каждый заголовок (Mod1, Mod2 ..) и идентификаторы, принадлежащие каждому заголовку.Ruby split string

Это то, что я пробовал до сих пор, который удаляет все после трубы, чего я не хочу.

mod_name = string.split(":")[0] 
mod_ids = string.split(":")[1] #This gets me the ID's but also include the |Mod* 
ids = mod_mod_ids.split("|").first.strip #Only returns Id's before the first "|" 

Желаемая Выход: мне нужно сохранить mod_name и mod_ids в соответствующих колонках,

mod_name = #name ("Mod1...Mod2 etc) #string 
mod_ids = #ids (All Ids after the ":" in Mod*:) #array 
+0

Что вам нужно сделать, это первый раскол на «|» чтобы дать вам массив строк «Mod1: num, num, num», а затем пропустить этот массив и разделить каждый элемент на «:», чтобы отделить идентификаторы от имен. – DiMono

+1

Вы должны указать, какой тип вывода вы хотите – Zippie

+0

@ Zippie, добавлено. Спасибо. – Yogzzz

ответ

1

Я думаю, что он делает то, что вы хотите:

ids = string.split("|").map {|part| [part.split(":")[0], part.split(":")[1].split(/,|;/)]} 
1

Есть несколько способов сделать это:

# This will split the string on "|" and ":" and will return: 
# %w(Mod1 id1 Mod2 id2 Mod3 id3 ...) 
ids = string.split(/[|:]/) 

# This will first split on "|", and for each string, split it again on ":" and returs: 
# [ %w(Mod1 id1), %w(Mod2 id2), %w(Mod3 id3), ... ] 
ids = string.split("|").map { |str| str.split(":") } 
0

Непроверенные:

all_mods = {} 
string.split("|").each do |fragment| 
    mod_fragments = fragment.split(":") 
    all_mods[mod_fragments[0]] = mod_fragments[1].split(",") 
end 
0

Что я получил благодаря помощи @tillerjs.

data = sting.split("|") 
data.each do |mod| 
    module_name = mod.split(":")[0] 
    recommendations = mod.split(":")[1] 
end 
1

Если вы хотите хэша в результате для легкого доступа через заголовки, то вы можете сделать это:

str.split('|').inject({}){|h,x| k,v = x.split(':'); h[k] = v.split(','); h} 

    => { 
     "Mod1"=>["10022932", "10828075", "5946410", "13321905", "5491120", "5030731"], 
     "Mod2"=>["22704455", "22991440", "22991464", "21984312", "21777721", "21777723", "21889761", "21939852", "23091478", "22339903", "23091485", "22099714", "21998260", "22364832", "21939858", "21944274", "21944226", "22800221", "22704443", "21777728", "21777719", "21678184", "21998265", "21834900", "21984331", "22704454", "21998261", "21944214", "21862610", "21836482"], 
     "Mod3"=>["10828075", "13321905", "5491120", "5946410", "5030731", "15806212", "4100566", "4787137", "2625339", "2408317", "2646868", "19612047", "2646862", "11983534", "8591489", "19612048", "10249319", "14220471", "15806209", "13330887", "15075124", "17656842", "3056657", "5086273"], 
     "Mod4"=>["10828075", "5946410", "13321905", "5030731", "5491120", "4787137", "4100566", "15806212", "2625339", "3542205", "2408317", "2646862", "2646868"], 
     "Mod5"=>["10022932;0.2512", "10828075;0.2093", "5030731;0.1465", "5946410;0.1465", "4787137;0.1465", "2625339;0.0143", "5491120;0.0143", "13321905;0.0143", "3542205;0.0143", "15806212;0.0119", "4100566;0.0119", "19612047;0.0100", "2408317;0.0100"] 
    } 
+0

Это потрясающе. Благодаря! – Yogzzz