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). :)
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
.
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/," ")
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.
modified_string = string.gsub(/\s+/, ' ').strip
Si vous utilisez Rails, il existe une méthode squish
"\tgoodbye\r\n".squish => "goodbye"
"\tgood \t\r\nbye\r\n".squish => "good bye"
lines2 = lines.split.join("\n")
"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
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>
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 ")
Pourquoi ne pas lire le fichier en mode texte plutôt qu'en mode binaire?
Juste une autre variante:
lines.delete(" \n")
Vous pouvez utiliser ceci:
my_string.strip.gsub(/\s+/, ' ')
lines.map(&:strip).join(" ")
def dos2unix(input)
input.each_byte.map { |c| c.chr unless c == 13 }.join
end
remove_all_the_carriage_returns = dos2unix(some_blob)