Ruby: ¿Cómo elimino selectivamente la envoltura de línea de un archivo de texto?
-
19-09-2019 - |
Pregunta
Quiero editar el siguiente texto para que cada línea comience con el concesionario:. Esto significa que no hay saltos/saltos de línea. Para las líneas que comienzan con el sistema, el envoltura está bien.
¿Cómo sería una solución en Ruby? Gracias
Esto se encuentra en un archivo .txt
Distribuidor: 5 segundos quedan para actuar
Distribuidor: Hitman2714 gana el bote (9)
Distribuidor: Mano #1684326626d
Distribuidor: Guitou699 tiene 5 segundos para
Actuar
Distribuidor: Guit¤u699 se ha agotado
Distribuidor: Baj Hasan tiene 5 segundos para
Actuar
Distribuidor: Baj Hasan se ha agotado
Distribuidor: Hitman2714 tiene 5 segundos restantes
actuar
Distribuidor: HITMAN2714 se ha agotado
Sistema: la garantía nocturna de $ 10,000
comenzará en 20 minutos
Distribuidor: Distribuidor: Hand #1684326626d
Distribuidor: Perspextive publica el gran
ciego de 25
Salida deseada:
Distribuidor: 5 segundos quedan para actuar
Distribuidor: Hitman2714 gana el bote (9)
Distribuidor: Mano #1684326626d
Distribuidor: Guitou699 tiene 5 segundos para actuar
Distribuidor: Guit¤u699 se ha agotado
Distribuidor: Baj Hasan le quedan 5 segundos para actuar
Distribuidor: Baj Hasan se ha agotado
Distribuidor: Hitman2714 tiene 5 segundos para actuar
Distribuidor: HITMAN2714 se ha agotado
Sistema: la garantía nocturna de $ 10,000
comenzará en 20 minutos
Distribuidor: Distribuidor: Hand #1684326626d
Distribuidor: Perspextive publica la gran ciega de 25
Solución
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
Si no le importa eliminar la envoltura en las líneas "Sistema", y si el archivo es lo suficientemente pequeño, puede hacer algo como esto:
puts ARGF.readlines.join('').gsub(/\n(?!Dealer: |System: )/, ' ')
Otros consejos
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
Utiliza stdin y stdout para entrada y salida.
content.gsub(/^(.*)\n(?!(Dealer|System|\Z))/, '\1 ')
grep
¿Por qué usar Ruby si este tipo de herramienta ya existe?
cat oldfile | grep ^Dealer: > newfile
rubí
Si se supone que esto es parte de una aplicación Ruby más grande, entonces no hay nada de malo en hacerlo en Ruby.
content= File.read(oldfile)
content= content.grep(/^Dealer:/)
File.open(newfile, "w") { |f| f.write(content) }