【问题标题】:How to parse a CSV file, update a field, then save如何解析 CSV 文件,更新字段,然后保存
【发布时间】:2011-04-03 10:35:26
【问题描述】:

我需要读取 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

我在这里做什么?如何保存所做的更改并更新文件?

【问题讨论】:

    标签: ruby csv


    【解决方案1】:

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

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

    csv_out = CSV::Writer.generate(File.open('new.csv', 'wb'))
    

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

    csv_out << row
    

    最后你可以关闭新文件:

    csv_out.close
    

    如 cmets 中所述,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
    

    【讨论】:

    • 我会在循环之外使用 csv_out.close 吗?
    • 是的,csv_out.close 将在 each_with_index 循环之外,因为您只想在完成循环原始文件中的行之后执行此操作。
    • 使用 open 的块形式,因为它更聪明,更符合 Ruby 的习惯。
    • CSV::Writer 在 ruby​​ 1.9+ 上不可用?
    • CSV::Writer 已被弃用。
    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 2017-05-04
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多