【问题标题】:export hash array to csv file将哈希数组导出到 csv 文件
【发布时间】:2016-02-24 07:06:37
【问题描述】:

我的目标是将哈希数组转换为 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 个特定列“consumption”和“z”的 CSV 文件。 当我使用这 3 行注释执行此操作时,输出是一个包含所有 @consumptions 的文件。如何选择这 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

【问题讨论】:

    标签: ruby-on-rails ruby csv export-to-csv


    【解决方案1】:

    根据您的反馈,我认为最好的方法是在您的视图中创建一个 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
    

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

    【讨论】:

    • 不行,csv文件输出的是@comsumption。输出:"{""x""=&gt;76, ""y""=&gt;""example"", ""z""=&gt;2015,""consumption""=&gt;#&lt;BigDecimal:7fea43610140,'0.5382857142E4',18(27)&gt;}","{""x""=&gt;76 (..)
    • 我删除了headers: true这部分,因为第一行csv &lt;&lt; ['consumption', 'z']会写标题。
    • 相同的输出没有任何变化:/ 怎么可能?
    • 您是否重新启动了服务器?我的输出绝对没有 x, y
    • 也许我错过了什么。只是为了确保:您将 self.to_csv 方法放在哪里?而Consumption 是模特?
    【解决方案2】:
    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 类,或者在控制器中定义一个方法。我的示例确实增加了 @consumptions 对象,您可以将所有这些内容放在控制器方法中,它应该可以工作。

    【讨论】:

    • 我把你的类 format.csv { send_data @comsumption.to_csv("x","y") } 出现错误。错误描述:参数数量错误(0..1 为 2)
    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 2020-01-24
    • 2018-01-22
    • 2019-02-04
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多