2010-08-24 75 views
9

我需要讀取CSV文件,更新字段,然後保存更改。我有一切工作正常,除了保存我的更改到我正在更新的字段:如何解析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 

我在這裏做什麼?如何保存我所做的更改並更新文件?

回答

11

我會做的是將更新後的記錄寫入新文件,然後如果需要,在完成程序後可以刪除舊文件並重命名新文件以獲得原始文件名。

爲此,我會在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 
+0

我會csv_out.close外循環? – thatmiddleway 2010-08-24 22:10:29

+0

是的,'csv_out.close'將會在'each_with_index'循環之外,因爲你只需要這樣做一次,並且在循環完成原始文件中的行之後。 – mikej 2010-08-24 22:12:24

+0

這很有道理,謝謝! – thatmiddleway 2010-08-24 22:13:03

相關問題