2010-08-24 79 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

相关问题