2016-08-03 26 views
0

Ich habe eine TXT-Datei mit Text wie folgt aufgebaut:Texteinblendung mit 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? 

Was ich möchte, ist zu erreichen, das „label“ einzufügen, sozusagen von der vorherige Meldung vor einer Nachricht, die kein Label hat. Zum Beispiel würde das Endergebnis wie folgt aussehen:

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? 

Wie würde ich dabei vorgehen?

Antwort

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

sollten Sie besser nutzen '% r' mit einem Trennzeichen anders als ein Schrägstrich für die wörtliche regex. – sawa

+0

@sawa, bitte erklären warum. –

+0

Weil Sie so viele Schrägstriche entkommen müssen. – 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 

Ausgang

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?