ruby – 如何将哈希输出到CSV行

我想将哈希映射到CSV行.

哈希中有几个对象:

person1 = {'first_name' => 'John','second_name' => 'Doe','favorite_color' => 'blue','favorite_band' => 'Backstreet Boys'}
person2 = {'first_name' => 'Susan','favorite_color' => 'green','second_name' => 'Smith'}

我想将其转换为CSV文件,其中键为列,每行的值.

我可以通过像这样创建一个CSV :: Row来轻松创建标题

h = CSV::Row.new(all_keys_as_array,[],true)

我不能依赖顺序而且更重要的是,并非所有的值都会被填满.

但是,当我现在尝试通过<<和数组向表中添加行时,将忽略标题的映射.它必须是正确的顺序.

为了证明这一点,我写了这个小脚本:

require 'csv'

person1 = {'first_name' => 'John','second_name' => 'Smith'}

persons = [person1,person2]
all_keys_as_array = %w{first_name second_name favorite_color favorite_band}

h = CSV::Row.new(all_keys_as_array,true)
t = CSV::Table.new([h])

persons.each do |p|
  r = CSV::Row.new([],false)
  p.each do |k,v|
    r << {k => v}
  end
  t << r
end

puts t.to_csv

我希望这个输出

first_name,last_name,favorite_color,favorite_band
John,Doe,blue,Backstreet Boys
Susan,Smith,green,

取而代之的是它们出现时的顺序值.所以输出是这样的:

first_name,second_name,Smith

最奇怪的是,当我通过['key']查找时,我得到了正确的值:

puts "favorite_bands: #{t['favorite_band']}"
> favorite_bands: [nil,"Backstreet Boys",nil]

那么有没有办法像我期望的那样写入CSV文件

解决方法

您可以迭代列名称
persons.each do |person|
  r = CSV::Row.new([],false)
  all_keys_as_array.each do |key|
    r << person[key]
  end
  t << r
end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...