2016-03-03 4 views
0

У меня есть строка, которая была импортирована из CSV, таких как:Rails разбить строку с несколькими частями

14 авг 2009: 1, 15 августа 2009: 1, шестнадцатый сен 2015: 1 | style1, 17 сентября 2015: 1 | Стиль 1

Я хочу, чтобы добавить эти данные в мою базу данных определенным образом. Сначала я разделил его на ,, чтобы получить каждую группу дат (в данном случае 4 даты).

Во-вторых, мне хотелось бы разделить каждую из этих групп дат на несколько сегментов. Первый с датой, второй с номером после двоеточия, а затем различной суммой больше для каждого из предметов, разделенных символом |.

Есть ли достойный эффективный способ добиться этого в Ruby?

В поисках результата быть хэш следующим образом:

{ '14th Aug 2009' => 1, '15th Aug 2009' => 1, '16th Aug 2009' => 1, '16th Sep 2015' => { 1 => 'Style 1' }, '17th Sep 2015' => { 1 => 'Style 1' } 

В принципе, если строка была так:

15 августа 2009: 1, 16 сентября 2015: 3 | Style1 | Стиль 1, 17 сентября 2015 : 1 | Стиль 1

я бы

{ '15th Aug 2009' => 1, '16th Sep 2015' => { '', 'Style 1', 'Style 1' }, '17th Sep 2015' => { 1 => 'Style 1' } 

В принципе, текст, разделенный |, должен быть присвоен номеру после двоеточия. Если число 3, и есть два набора текста после того, как он тогда один является пустой строкой, а два других будут говорить текст (например:. «Стиль 1»

Извините за звучание очень запутанным

+0

Можете ли вы привести пример того, что вывод должен быть что вы пробовали до сих пор? –

+1

Ваш формат выходного файла недействителен: '{'', 'Style 1', 'Style 1'}'. Вы хотите использовать вместо этого массив? Например: '['', 'Style 1' 'Style 1'] '? – infused

+0

' st ring.split (",") .each_with_object ({}) {| line, hsh | k, * tokens = line.split (/: | \ | /); hsh [k] = tokens} 'должен делать трюк – bjhaid

ответ

1

. Я предполагаю, что вы имели в виду для «|».? отдел ют элементы, чтобы построить массив, а настоянный спросил о том, как об этом

s ="15th Aug 2009:1, 16th Sep 2015:3|Style1|Style 1, 17th Sep 2015:1|Style 1" 
result = {} 
s.split(',').each do |v| 
    date,rest = v.split(':') 
    items = rest.split('|') 
    if items[0] == "1" 
    result[date] = 1 
    else 
    result[date] = ['', items[1..-1]] 
    end 
end 
+0

Это пока выглядит хорошо. Сегодня я пойду. Мне нужно настроить его для создания соответствующих записей в моей БД, но я вижу общую идею. Благодарю. Не могли бы вы подробнее рассказать о том, что делает эта линия? 'result [date] = ['', items [1 ..- 1]]' – rctneil

+0

Очень ценю это. Я изменил его, чтобы создать необходимые записи в моей базе данных, которые мне нужны, а затем расширил ее с более необходимой функциональностью. Спасибо, что дал мне отличную отправную точку и заставил меня решить это! – rctneil

Смежные вопросы