2016-08-03 3 views
0

У меня есть .txt файл с текстом выложенный, как это:вставка текста с помощью Ruby,

11/14/2015, 13:51: John Doe: Hi there 
11/14/2015, 13:52: Jane Doe: Hi, my name is Jane. 
Nice to meet you. 
11/14/2015, 13:53: Joe Bloggs: Hey there everyone! 
Shall we get started? 

То, что я хотел бы, чтобы выполнить это вставить «ярлык», так сказать, предыдущее сообщение перед сообщением, в котором отсутствует метка. Например, конечный результат будет выглядеть так:

11/14/2015, 13:51: John Doe: Hi there 
11/14/2015, 13:52: Jane Doe: Hi, my name is Jane. 
11/14/2015, 13:52: Jane Doe: Nice to meet you. 
11/14/2015, 13:53: Joe Bloggs: Hey there everyone! 
11/14/2015, 13:53: Joe Bloggs: Shall we get started? 

Как бы я это сделал?

ответ

1
txt =<<_ 
11/14/2015, 13:51: John Doe: Hi there 
11/14/2015, 13:52: Jane Doe: Hi, my name is Jane. 
Nice to meet you. 
11/14/2015, 13:53: Joe Bloggs: Hey there everyone! 
Shall we get started? 
_ 

R = %r{\A\d{2}/\d{2}/\d{4}\,\s\d{2}:\d{2}:\s} 

arr = txt.split("\n") 
    #=> ["11/14/2015, 13:51: John Doe: Hi there", 
    # "11/14/2015, 13:52: Jane Doe: Hi, my name is Jane.", 
    # "Nice to meet you.", 
    # "11/14/2015, 13:53: Joe Bloggs: Hey there everyone!", 
    # "Shall we get started?"] 
(1..arr.size-1).each do |i| 
    next if arr[i] =~ R 
    previous_line = arr[i-1] 
    leader = previous_line[0, 2 + previous_line.rindex(": ")] 
    arr[i] = leader.concat(arr[i]) 
end 
arr 
    #=> ["11/14/2015, 13:51: John Doe: Hi there", 
    # "11/14/2015, 13:52: Jane Doe: Hi, my name is Jane.", 
    # "11/14/2015, 13:52: Jane Doe: Nice to meet you.", 
    # "11/14/2015, 13:53: Joe Bloggs: Hey there everyone!", 
    # "11/14/2015, 13:53: Joe Bloggs: Shall we get started?"] 
+0

Вы должны лучше использовать '% r' с разделителем, кроме косой черты для регулярных выражений буквального. – sawa

+0

@sawa, объясните пожалуйста почему. –

+0

Потому что вам нужно сбежать так много черт. – sawa

1
input = StringIO.new <<~_ 
    11/14/2015, 13:51: John Doe: Hi there 
    11/14/2015, 13:52: Jane Doe: Hi, my name is Jane. 
    Nice to meet you. 
    11/14/2015, 13:53: Joe Bloggs: Hey there everyone! 
    Shall we get started? 
_ 

label = nil 
output = input.each_with_object("") do 
    |l, s| 
    if l =~ %r[\A\d{2}/\d{2}/\d{4}, \d{2}:\d{2}: ] 
    label = $& 
    s.concat(l) 
    else 
    s.concat(label + l) 
    end 
end 
puts output 

выход

11/14/2015, 13:51: John Doe: Hi there 
11/14/2015, 13:52: Jane Doe: Hi, my name is Jane. 
11/14/2015, 13:52: Nice to meet you. 
11/14/2015, 13:53: Joe Bloggs: Hey there everyone! 
11/14/2015, 13:53: Shall we get started? 
Смежные вопросы