web-dev-qa-db-fra.com

Comment supprimer les retours de chariot avec Ruby?

Je pensais que ce code fonctionnerait, mais l’expression régulière ne correspond jamais à la\r\n. J'ai visualisé les données que je lis dans un éditeur hexadécimal et vérifié qu'il existe bien un motif hexadécimal D et hexa A dans le fichier.

J'ai également essayé les expressions régulières/\ xD\xA/m et/\ x0D\x0A/m mais elles ne correspondaient pas non plus.

Ceci est mon code en ce moment:

   lines2 = lines.gsub( /\r\n/m, "\n" )
   if ( lines == lines2 )
       print "still the same\n"
   else
       print "made the change\n"
   end

En plus des alternatives, il serait agréable de savoir ce que je fais mal (pour faciliter certains apprentissages de ma part). :)

68
Jeremy Mullin

Qu'est-ce que vous obtenez quand vous faites puts lines? Cela vous donnera un indice.

Par défaut File.open ouvre le fichier en mode texte, votre \r\n caractères seront automatiquement convertis en \n. Peut-être que c'est la raison pour laquelle lines sont toujours égaux à lines2. Pour empêcher Ruby) d’analyser les fins de ligne, utilisez le mode rb:

C: \> copie avec lala.txt 
 A 
 Fichier 
 Avec 
 Plusieurs 
 Lignes 
 ^ Z 
 
 C: \> irb 
 Irb (principal): 001: 0> text = File.open ('lala.txt'). Read 
 => "A\nfile\navec\nmany\nlines\n "
 irb (principal): 002: 0> bin = File.open ('lala.txt', 'rb'). read 
 =>" a\r\nfichier\r\n avec\r\nmany\r\nlines\r\n "
 irb (principal): 003: 0> 

Mais à partir de votre question et de votre code, je vois que vous devez simplement ouvrir le fichier avec le modificateur par défaut. Vous n'avez besoin d'aucune conversion et pouvez utiliser le plus court File.read.

23
Rômulo Ceccon

Utilisez String # strip

Renvoie une copie de str avec les espaces blancs de début et de fin supprimés.

par exemple

"    hello    ".strip   #=> "hello"   
"\tgoodbye\r\n".strip   #=> "goodbye"

Utiliser gsub

string = string.gsub(/\r/," ")
string = string.gsub(/\n/," ")
160
Ian Vaughan

En général, lorsque je traite avec le strip-tease ou\n, je vais chercher les deux en faisant quelque chose comme:

lines.gsub(/\r\n?/, "\n");

J'ai constaté qu'en fonction de la manière dont les données ont été sauvegardées (le système d'exploitation utilisé, l'éditeur utilisé, la relation de Jupiter avec Io à l'époque), il peut y avoir ou non une nouvelle ligne après le retour à la ligne. Il semble étrange que vous voyiez les deux personnages en mode hexadécimal. J'espère que cela t'aides.

35
localshred
modified_string = string.gsub(/\s+/, ' ').strip
17
Vik

Si vous utilisez Rails, il existe une méthode squish

"\tgoodbye\r\n".squish => "goodbye"

"\tgood \t\r\nbye\r\n".squish => "good bye"

16
neck
lines2 = lines.split.join("\n")
15
Cameron Price

"still the same\n".chomp
ou
"still the same\n".chomp!

http://www.Ruby-doc.org/core-1.9.3/String.html#method-i-chomp

14
Joel AZEMAR

Que diriez-vous de ce qui suit?

irb(main):003:0> my_string = "Some text with a carriage return \r"
=> "Some text with a carriage return \r"
irb(main):004:0> my_string.gsub(/\r/,"")
=> "Some text with a carriage return "
irb(main):005:0>

Ou...

irb(main):007:0> my_string = "Some text with a carriage return \r\n"
=> "Some text with a carriage return \r\n"
irb(main):008:0> my_string.gsub(/\r\n/,"\n")
=> "Some text with a carriage return \n"
irb(main):009:0>
6
mwilliams

Je pense que votre regex est presque terminée - voici ce que je ferais:

lines2 = lines.gsub(/[\r\n]+/m, "\n")

Dans ce qui précède, j’ai mis\r et\n dans une classe (ainsi, peu importe l’ordre dans lequel ils pourraient apparaître) et ajouté le qualificatif "+" (de sorte que "\ r\n\r\n\r\n "correspondrait également une fois, et le tout a été remplacé par"\n ")

2
Nathan Crause

Pourquoi ne pas lire le fichier en mode texte plutôt qu'en mode binaire?

2
Andrew Grimm

Juste une autre variante:

lines.delete(" \n")
2
k1r8r0wn

Vous pouvez utiliser ceci:

my_string.strip.gsub(/\s+/, ' ')
1
Alain Beauvois
lines.map(&:strip).join(" ")
1
frenesim
def dos2unix(input)
  input.each_byte.map { |c| c.chr unless c == 13 }.join
end

remove_all_the_carriage_returns = dos2unix(some_blob)
0
Dennis