Anurag Uniyal
Anurag Uniyal

Reputation: 88727

How do I skip headers while writing CSV?

I am writing a CSV file and CSV.dump outputs two header lines which I don't want.

I tried setting :write_headers => false but still it outputs a header:

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

Upvotes: 4

Views: 273

Answers (2)

the Tin Man
the Tin Man

Reputation: 160553

I think the problem is two-fold:

CSV.dump [a]

wraps an instance of the struct a in an array, which then CSV tries to marshall. While that might be useful sometimes, when trying to generate a CSV file for consumption by some other non-Ruby app that recognizes CSV, you're going to end up with values that can't be used. Looking at the output, it isn't CSV:

class,A
a=,b=
1,2

Looking at it in IRB shows:

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

which, again, isn't going to be accepted by something like a spreadsheet or database. So, another tactic is needed.

Removing the array from a doesn't help:

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

Heading off a different way, I looked at a standard way of generating CSV from an array:

puts a.to_a.to_csv
=> 1,2

An alternate way to create it is:

CSV.generate do |csv|
  csv << a.to_a
end
=> "1,2\n"

Upvotes: 0

Ismael
Ismael

Reputation: 16710

I don't think you can do it with option parameters. But you can easily accomplish what you want by not using the generate method

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

Upvotes: 1

Related Questions