#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. Я также внедряю ваш способ сокращения, гораздо более эффективный! Спасибо!