2011-10-18 1 views
0

J'ai un fichier texte et j'essaie de remplacer certaines lignes par les valeurs dans un hachage. J'essaie de faire en boucle le fichier, et d'échanger tout ce qui correspond au hachage. Pour une raison quelconque, cela ne fonctionne pas, il ne fait que dupliquer le fichier, n'échange rien. Des idées?Échange de mots dans le fichier avec hachage

HASHBROWNS{ 

'mustard' => 'dijon', 
'ketchup' => 'catsup', 

} 


File.open('new_hashed_file.txt', 'w') do |file| 
    File.open('oldfile.txt', 'r').readlines.each do |swaparoo| 
     if HASHBROWNS.has_key?(swaparoo.downcase) 
      file.puts HASHBROWNS[swaparoo.downcase] 
     else 
      file.puts swaparoo 
     end 
    end 
end 

Merci

Ryn

Répondre

2

Modifier cette ligne:

File.open('oldfile.txt', 'r').readlines.each do |swaparoo| 

à ceci:

File.open('oldfile.txt', 'r').readlines.map(&:chomp).each do |swaparoo| 

Le problème est votre gamme de lignes contient des sauts de ligne.

+0

La chose de nouvelle ligne m'a lancé pour une boucle! Merci J'ai bien travaillé! – Ryn

2

Lorsque vous lisez des données avec readlines il y aura une nouvelle ligne présent dans chaque chaîne. C'est ce qui fait manquer votre match. Le moyen le plus facile est de le couper avec chomp. Vous pouvez modifier votre test do légèrement:

File.open('new_hashed_file.txt', 'w') do |file| 
    File.open('oldfile.txt', 'r').readlines.each do |line| 
    line = line.chomp.downcase 

    file.puts HASHBROWNS[line] || line 
    end 
end 

Une chose à faire attention à n'est pas à plusieurs reprises appeler des méthodes comme downcase si vous pouvez simplement sauvegarder le résultat à une variable temporaire et le recycler.

+0

Je suis également en train de mettre en œuvre votre façon de downcasing, beaucoup plus efficace! Merci! – Ryn