将散列数组导出到 csv 文件

export hash array to csv file

我的objective是将哈希数组转换为csv文件。 这是我的控制器:

respond_to do |format|
        format.html
        format.csv { send_data @comsumptions.to_csv }
end

@comsumptions 是一个哈希数组:

[{"x"=>76,
  "y"=>"example",
  "z"=>2015,
  "consumption"=>#<BigDecimal:7fea4a1cadb8,'0.5382857142E4',18(27)>},
 {"x"=>76,
  "y"=>"example2",
  "z"=>2015,
  "consumption"=>#<BigDecimal:7fea4a1ca7c8,'0.5437E4',9(27)>},(..)

我想创建一个包含 2 个特定列的 CSV 文件,"consumption" 和 "z"。 当我用这 3 行评论执行此操作时,输出是一个包含所有 @consumptions 的文件。我如何 select 这 2 列并在 cv 文件中进行转换?

def self.to_csv
    CSV.generate(headers: true ) do |csv|
      #csv << column_names
      #all.each do |product|
      #  csv << product.attributes.values_at(*column_names)
      end
    end
  end

根据您的反馈,我认为最好的方法是在您的视图中创建一个 csv 视图文件。例如,如果您的 html 文件是 comsumptions.html.erb,那么您的 csv 视图文件应该是 comsumptions.csv.ruby

# comsumptions.csv.ruby
require 'csv'

CSV.generate do |csv|
  csv << ['consumption', 'z']
  @comsumptions.each do |c|
    csv << [ c['consumption'].to_s, c['z'] ]
  end
end

我们也需要更换控制器。删除respond_to部分或修改如下

respond_to do |format|
  format.html
  format.csv 
end

我已经在我的本地主机上进行了测试,这应该可以工作!

require 'csv'

@comsumptions =
[{"x"=>76,
  "y"=>"example",
  "z"=>2015},
 {"x"=>76,
  "y"=>"example2",
  "z"=>2015}]

class << @comsumptions
  def to_csv (*keys)
    keys = first.keys if keys.empty?
    CSV.generate(headers: keys, write_headers: true) do |csv|
      each do |e|
        csv << e.values_at(*keys)
      end
    end
  end
end

p @comsumptions.to_csv("x","y")
p @comsumptions.to_csv()

这个解决方案在很大程度上受到 Van Huy 的启发,适用于任何数组哦哈希,只要哈希具有所有相同的键,否则会出现未定义的行为

我不清楚您将 def self.to_csv 方法放在控制器中的什么位置?那是错的。您想要做的是扩充 @consumptions 对象,扩充 Array class,或者在控制器中定义一个方法。我的示例确实增加了 @consumptions 对象,您可以将所有这些东西放在控制器方法中,它应该可以工作。