如何将散列数组添加到 csv 文件中?

Posted

技术标签:

【中文标题】如何将散列数组添加到 csv 文件中?【英文标题】:How to add an array of hashes into a csv file? 【发布时间】: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" 的缩写。 【参考方案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? 确定文件是否为空。

【讨论】:

以上是关于如何将散列数组添加到 csv 文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apache Shiro 将散列密码存储到数据库中?

如何使 Vue.js 将散列密码发布到 Django REST API AbstractBaseUser 自定义模型?

SQL Server - 如何将散列密码插入表?

Ruby:如何将散列转换为 HTTP 参数?

如何合并散列数组以获取值数组的散列

使用 bcryptjs 将散列密码保存到数据库时出错