Что бы я сделал, это записал обновленные записи в новый файл, а затем, если хотите, после того, как вы закончили, ваша программа может удалить старый файл и переименовать новый файл, чтобы иметь исходное имя файла.
Для этого я бы открыл выходной файл в верхней части вашего кода, вне цикла each_with_index
. например,
csv_out = CSV::Writer.generate(File.open('new.csv', 'wb'))
Затем внутри цикла each_with_index
вы можете записать текущую строку в новый файл следующим образом:
csv_out << row
Затем в конце вы можете закрыть новый файл:
csv_out.close
Как уже упоминалось в комментариях, CSV::Writer
больше не находится в стандартной библиотеке. Эквивалентная версия кода с использованием более новых CSV.foreach
(для чтения) и CSV.open
(для записи):
CSV.open("path/to/file.csv", "wb") do |csv_out|
CSV.foreach("#{RAILS_ROOT}/doc/some.csv") do |row|
address = row[5]
l = Location.address_find(address)
if l != nil
puts "#{l.name} at #{l.address}"
row[14] = l.store_code
puts row[14]
else
puts "No matching address Found!!!"
end
csv_out << row
end
end