Поменять местами слова в файле с помощью хэша

#ruby

#ruby

Вопрос:

У меня есть текстовый файл, и я пытаюсь заменить определенные строки значениями в хэше. Я пытаюсь заставить его перебирать файл и заменять все, что соответствует хэшу. По какой-то причине это не работает, оно только дублирует файл, ничего не заменяет. Есть идеи?

 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
  

Спасибо

Ryn

Ответ №1:

Измените эту строку:

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

для этого:

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

Проблема в том, что ваш массив строк содержит новые строки.

Комментарии:

1. Новая строка заставила меня зациклиться! Спасибо, отлично сработало!

Ответ №2:

Когда вы читаете данные с readlines помощью, в каждой строке будет присутствовать новая строка. Это то, что заставляет ваше совпадение пропустить. Самый простой способ — просто обрезать его с chomp помощью . Возможно, вы захотите немного изменить свой тест:

 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
  

Одна вещь, на которую следует обратить внимание, — это не повторный вызов методов, например downcase , если вы можете просто сохранить результат во временной переменной и переработать его.

Комментарии:

1. Я также внедряю ваш способ сокращения, гораздо более эффективный! Спасибо!