Ruby:如何使用dump方法将数据输出到csv文件?

我尝试使用ruby标准csv lib将对象的arr转储到名为’a.csv’的csv.file中

http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html#method-c-dump

dump(ary_of_objs, io = "", options = Hash.new) 

但在这种方法中,我如何转储到文件中? 没有这样的例子存在和帮助。 我谷歌没有为我做的例子……

此外,文档说…

您可以提供的下一个方法是名为csv_headers()的实例方法。 期望此方法返回文档的第二行(再次作为数组),用于为每列提供标题。 默认情况下,:: load将设置一个实例变量,如果字段标题以@字符开头或调用send()将标头作为方法名称并将字段值作为参数传递。 仅在Array的第一个对象上调用此方法。

任何人都知道如何将实例方法csv_headers()传递给此转储函数?

我还没有测试过,但看起来应该将io设置为文件。 根据您链接的文档“io参数可用于序列化为文件”

就像是:
f = File.open("filename")
dump(ary_of_objs, io = f, options = Hash.new)

接受的答案并没有真正回答这个问题,所以我想我会给出一个有用的例子。

首先,如果您查看http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html上的文档,如果将鼠标hover在dump的方法名称上,您会看到可以click to show source 。 如果你这样做,你会发现dump方法试图在你从ary_of_objs传入的第一个对象上调用ary_of_objs

 obj_template = ary_of_objs.first ...snip... headers = obj_template.csv_headers 

然后你会看到该方法将在ary_of_objs每个对象上调用ary_of_objs并传入headers

 ary_of_objs.each do |obj| begin csv << obj.csv_dump(headers) rescue NoMethodError csv << headers.map do |var| if var[0] == @ obj.instance_variable_get(var) else obj[var[0..-2]] end end end end 

所以我们需要扩充array_of_objs每个条目以响应这两个方法。 下面是一个示例包装器类,它将接受Hash ,并将散列键作为CSV标头返回,然后能够根据标头转储每一行。

 class CsvRowDump def initialize(row_hash) @row = row_hash end def csv_headers @row.keys end def csv_dump(headers) headers.map { |h| @row[h] } end end 

还有一个问题。 这个dump方法想要在标题之前在CSV文件的顶部写一个额外的行,如果由于此代码在顶部调用此方法,则无法跳过它:

  # write meta information begin csv << obj_template.class.csv_meta rescue NoMethodError csv << [:class, obj_template.class] end 

即使你从CsvRowDump.csv_meta返回'',它仍然是一个空行,其中一个解析期望标题。 因此,让我们让dump写入该行,然后在调用dump时将其删除。 此示例假定您有一个哈希数组,它们都具有相同的键(将是CSV标头)。

 @rows = @hashes.map { |h| CsvRowDump.new(h) } File.open(@filename, "wb") do |f| str = CSV::dump(@rows) f.write(str.split(/\n/)[1..-1].join("\n")) end