如何解析CSV文件,更新字段,然后保存

tha*_*way 10 ruby 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
Run Code Online (Sandbox Code Playgroud)

我该怎么办?如何保存我所做的更改并更新文件?

mik*_*kej 12

我要做的是将更新的记录写入新文件,然后,如果需要,在完成程序后可以删除旧文件并将新文件重命名为原始文件名.

为此,我将在each_with_index循环外部打开代码顶部的输出文件.例如

csv_out = CSV::Writer.generate(File.open('new.csv', 'wb'))
Run Code Online (Sandbox Code Playgroud)

然后在each_with_index循环内部,您可以将当前行写入新文件,如下所示:

csv_out << row
Run Code Online (Sandbox Code Playgroud)

然后在最后你可以关闭新文件:

csv_out.close
Run Code Online (Sandbox Code Playgroud)

正如评论中所提到的,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
Run Code Online (Sandbox Code Playgroud)