【问题标题】:How to add an array of hashes into a csv file?如何将散列数组添加到 csv 文件中?
【发布时间】:2022-01-16 21:45:37
【问题描述】:

我找到了this code,它很适合我,我把它改成了这个:

def write_in_file(file_name, hash)
    column_names = hash.first.keys
    s=CSV.generate do |csv|
        csv << column_names
        hash.each do |x|
            csv << x.values
        end
    end
File.write("#{file_name}.csv", s)
end

这就是我的哈希数组的样子:

[
  {:Name => "John", :Age => 26, :Country => America},
  {:Name => "Ivan", :Age => 34, :Country => Russia},
  {:Name => "Pablo", :Age => 20, :Country => Columbia}
]

但问题是每次我调用此方法时 - 它都会重写整个文件。如果我想保存此标头并在每次迭代中添加新信息,如何更改它?

【问题讨论】:

  • append 模式打开文件 (mode: 'a') 并在后续写入时跳过写入标题行。
  • 写“mode:'a'”而不是's'?以及如何在后续写入中跳过写入标头?
  • 不,s 是您的内容。是File.write("#{file_name}.csv", s, mode: 'a'),详情请咨询docs。对于标题:您最初可以检查文件是否存在。如果不是,你写标题行。如果它存在,则假设标题在那里并且只写值。
  • 感谢您解决了我的问题! :)
  • @gurman "a" 是 "append" 的缩写。

标签: ruby csv hash append


【解决方案1】:

您可以使用mode: 'a' 附加到现有文件:(请参阅open modes

File.write("#{file_name}.csv", s, mode: 'a')

要仅在第一次运行时写入标头,您可以检查文件是否存在。此外,您应该使用固定的标头并按特定顺序获取哈希值,例如:

CSV.generate do |csv|
  csv << %w[Name Age Country] unless File.exist?("#{file_name}.csv")

  hash.each do |x|
    csv << x.values_at(:Name, :Age, :Country)
  end
end

File.write("#{file_name}.csv", s, mode: 'a')

还有 CSV.open 为您创建文件:

CSV.open("#{file_name}.csv", 'a') do |csv|
  csv << %w[Name Age Country] if csv.stat.zero?

  hash.each do |x|
    csv << x.values_at(:Name, :Age, :Country)
  end
end

由于执行块时文件始终存在,因此需要更改标题检查:csv.stat 返回文件的File::Statzero? 确定文件是否为空。

【讨论】:

    猜你喜欢
    • 2015-11-29
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多