Как проанализировать файл CSV, обновить поле, затем сохранить - PullRequest
10 голосов
/ 25 августа 2010

Мне нужно прочитать файл CSV, обновить поле и сохранить изменения. У меня все работает нормально, кроме сохранения изменений в поле, которое я обновляю:

require 'csv'
@parsed_file = CSV::Reader.parse(File.open("#{RAILS_ROOT}/doc/some.csv"))
@parsed_file.each_with_index  do |row, x|
  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
  #What do I do here? Something like this? CSV::Writer.generate(@parsed_file) 
end

Что мне здесь делать? Как сохранить внесенные изменения и обновить файл?

1 Ответ

12 голосов
/ 25 августа 2010

Что бы я сделал, это записал обновленные записи в новый файл, а затем, если хотите, после того, как вы закончили, ваша программа может удалить старый файл и переименовать новый файл, чтобы иметь исходное имя файла.

Для этого я бы открыл выходной файл в верхней части вашего кода, вне цикла 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...