4

我正在编写一个 CSV 文件并CSV.dump输出两个我不想要的标题行。

我尝试设置:write_headers => false但它仍然输出一个标题:

irb> A = Struct.new(:a, :b)
=> A
irb> a = A.new(1,2)
=> #<struct A a=1, b=2>
irb> require 'csv'
=> true
irb> puts CSV.dump [a], '', :write_headers => false, :headers=>false
class,A
a=,b=
1,2
4

2 回答 2

1

我认为您不能使用选项参数来做到这一点。但是你可以通过不使用 generate 方法轻松完成你想要的

irb> arr = [a, a]
=> [#<struct A a=1, b=2>, #<struct A a=1, b=2>]
irb> csv_string = CSV.generate do |csv|
irb*   arr.each {|a| csv << a}
irb> end
irb> puts csv_string
1,2
1,2
=> nil
于 2013-01-29T01:51:53.487 回答
0

我认为问题有两个方面:

CSV.dump [a]

将结构的一个实例包装a在一个数组中,然后 CSV 尝试对其进行编组。虽然有时这可能很有用,但当尝试生成一个 CSV 文件以供其他识别 CSV 的非 Ruby 应用程序使用时,您最终会得到无法使用的值。查看输出,它不是 CSV:

类,A
a=,b=
1,2

在 IRB 中查看它显示:

=> "class,A\na=,b=\n1,2\n"

同样,它不会被电子表格或数据库之类的东西所接受。因此,需要另一种策略。

从中删除数组a无济于事:

CSV.dump a
=> "class,Fixnum\n\n\n\n"

换一种方式,我研究了一种从数组生成 CSV 的标准方法:

puts a.to_a.to_csv
=> 1,2

创建它的另一种方法是:

CSV.generate do |csv|
  csv << a.to_a
end
=> "1,2\n"
于 2013-01-29T03:10:42.960 回答