Ruby: ¿Cómo elimino selectivamente la envoltura de línea de un archivo de texto?

StackOverflow https://stackoverflow.com/questions/1913897

  •  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

¿Fue útil?

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) }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top