如何将散列数组添加到 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::Stat
和zero?
确定文件是否为空。
【讨论】:
以上是关于如何将散列数组添加到 csv 文件中?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Apache Shiro 将散列密码存储到数据库中?