Ruby: come rimuovo selettivamente la riga da un file di testo?
-
19-09-2019 - |
Domanda
Voglio modificare il seguente testo in modo che ogni riga inizi con il rivenditore:. Questo significa nessuna pausa di avvolgimento/linea. Per le linee che iniziano con il sistema, l'avvolgimento va bene.
Come sarebbe una soluzione in Ruby? Grazie
Questo si trova in un file .txt
Rivenditore: 5 secondi rimasti per agire
Dealer: Hitman2714 vince il piatto (9)
Rivenditore: mano #1684326626d
Rivenditore: Guitou699 ha 5 secondi rimasti a
atto
Rivenditore: Guit¤u699 ha scaduto
Rivenditore: Baj Hasan è rimasto 5 secondi a
atto
Rivenditore: Baj Hasan ha scaduto
Rivenditore: Hitman2714 ha 5 secondi rimasti
recitare
Rivenditore: Hitman2714 ha scaduto
Sistema: la garanzia notturna da $ 10.000
inizierà tra 20 minuti
Rivenditore: rivenditore: mano #1684326626d
Rivenditore: pustxtive pubblica il grande
cieco di 25
Output desiderato:
Rivenditore: 5 secondi rimasti per agire
Dealer: Hitman2714 vince il piatto (9)
Rivenditore: mano #1684326626d
Rivenditore: Guitou699 ha 5 secondi per agire
Rivenditore: Guit¤u699 ha scaduto
Rivenditore: Baj Hasan ha 5 secondi per agire
Rivenditore: Baj Hasan ha scaduto
Dealer: Hitman2714 ha 5 secondi per agire
Rivenditore: Hitman2714 ha scaduto
Sistema: la garanzia notturna da $ 10.000
inizierà tra 20 minuti
Rivenditore: rivenditore: mano #1684326626d
Rivenditore: Pospettive pubblica il Big Blind di 25
Soluzione
remove_newline = false
ARGF.each_line do |line|
if line =~ /^(Dealer|System): /
puts if remove_newline
remove_newline = ($1 == 'Dealer')
end
line.sub!(/\n/, ' ') if remove_newline
print line
end
Se non ti dispiace eliminare l'involucro sulle righe del "sistema" e se il file è abbastanza piccolo, puoi fare qualcosa del genere:
puts ARGF.readlines.join('').gsub(/\n(?!Dealer: |System: )/, ' ')
Altri suggerimenti
previous = ''
ARGF.each_with_index do |line, i|
line.chomp!
unless i == 0
if line =~ /^Dealer/ || line =~ /^System/
puts previous
previous = line
else
previous << (previous =~ /^System/ ? "\n" : " ") << line
end
else
previous = line
end
end
puts previous
Utilizza stdin e stdout per input e output.
content.gsub(/^(.*)\n(?!(Dealer|System|\Z))/, '\1 ')
grep
Perché usare Ruby se questo tipo di strumento esiste già
cat oldfile | grep ^Dealer: > newfile
rubino
Se questo dovrebbe far parte di un'applicazione di Ruby più grande, allora non c'è nulla di sbagliato nel farlo in Ruby.
content= File.read(oldfile)
content= content.grep(/^Dealer:/)
File.open(newfile, "w") { |f| f.write(content) }