将散列数组导出到 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
对象,您可以将所有这些东西放在控制器方法中,它应该可以工作。
我的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
对象,您可以将所有这些东西放在控制器方法中,它应该可以工作。