2009-12-16 3 views
1

Je veux éditer le texte suivant afin que chaque ligne commence avec Dealer :. Cela signifie pas d'emballage/sauts de ligne. Pour les lignes commençant par System, l'habillage est correct. À quoi ressemblerait une solution dans ruby? MerciRuby: Comment supprimer de manière sélective le retour à la ligne d'un fichier texte?

Il est situé dans un fichier txt

Concessionnaire: 5 secondes pour agir
Concessionnaire: hitman2714 gagne le pot (9)
Concessionnaire: Main # 1684326626D
Concessionnaire: Guitou699 a 5 secondes de gauche à
acte
Marchand: Guit¤u699 a expiré
Dealer: BAJ Hasan a 5 secondes à

acte D ealer: BAJ Hasan a expiré
Concessionnaire: hitman2714 a 5 secondes à
pour agir
Concessionnaire: hitman2714 a expiré
Système: La nuit 10 000 $ garantie
sera à partir de 20 minutes
Concessionnaire: Concessionnaire: # 1684326626D main
Dealer: messages Perspextive big blind
de 25

sortie souhaitée:

Concessionnaire: 5 secondes pour agir
Concessionnaire: hitman2714 gagne le pot (9)
Concessionnaire: Main # 1684326626D
Concessionnaire: Guitou699 a 5 secondes pour agir
Concessionnaire: Guit¤u699 a expiré
Concessionnaire: BAJ Hasan a 5 secondes pour agir
Concessionnaire: BAJ Hasan a expiré
Concessionnaire: hitman2714 a 5 secondes pour agir
Concessionnaire: hitman2714 a expiré
Système: La nuit 10 000 $ garantie
sera à partir de 20 minutes
Concessionnaire: Concessionnaire: # Main 1684326626D
Marchand: messages Perspextive big blind de 25

Répondre

2
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 cela ne vous dérange pas d'éliminer l'emballage sur les lignes « système », et si le fichier est assez petit, vous pouvez faire quelque chose comme ceci:

puts ARGF.readlines.join('').gsub(/\n(?!Dealer: |System:)/, ' ') 
1
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 

Utilise STDIN et STDOUT pour l'entrée et sortie.

0

grep

Pourquoi utiliser rubis si ce genre d'outil existe déjà

cat oldfile | grep ^Dealer: > newfile 

rubis

Si cela est supposé faire partie d'une plus grande application de rubis, alors il n'y a rien de mal à le faire en ruby.

content= File.read(oldfile) 
content= content.grep(/^Dealer:/) 
File.open(newfile, "w") { |f| f.write(content) } 
1
content.gsub(/^(.*)\n(?!(Dealer|System|\Z))/, '\1 ')