在Ruby中将数组输出为CSV

时间:2011-01-27 22:02:23

标签: ruby csv

使用Ruby将CSV文件读入数组很容易,但我找不到有关如何将数组写入CSV文件的任何好文档。谁能告诉我怎么做?

如果重要的话,我正在使用Ruby 1.9.2。

6 个答案:

答案 0 :(得分:290)

到文件:

require 'csv'
CSV.open("myfile.csv", "w") do |csv|
  csv << ["row", "of", "CSV", "data"]
  csv << ["another", "row"]
  # ...
end

到一个字符串:

require 'csv'
csv_string = CSV.generate do |csv|
  csv << ["row", "of", "CSV", "data"]
  csv << ["another", "row"]
  # ...
end

以下是有关CSV的最新文档:http://ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html

答案 1 :(得分:33)

我把它归结为一行。

rows = [['a1', 'a2', 'a3'],['b1', 'b2', 'b3', 'b4'], ['c1', 'c2', 'c3'], ... ]
csv_str = rows.inject([]) { |csv, row|  csv << CSV.generate_line(row) }.join("")
#=> "a1,a2,a3\nb1,b2,b3\nc1,c2,c3\n" 

将以上中的所有内容保存到csv中,一行。

File.open("ss.csv", "w") {|f| f.write(rows.inject([]) { |csv, row|  csv << CSV.generate_line(row) }.join(""))}

注:

将活动记录数据库转换为csv就像我想的那样

CSV.open(fn, 'w') do |csv|
  csv << Model.column_names
  Model.where(query).each do |m|
    csv << m.attributes.values
  end
end

嗯@tamouse,如果没有阅读csv源,这个要点对我来说有点混乱,但一般来说,假设你的阵列中的每个哈希具有相同数量的k / v对&amp;密钥总是相同的,按照相同的顺序(即如果你的数据是结构化的),这应该做的事情:

rowid = 0
CSV.open(fn, 'w') do |csv|
  hsh_ary.each do |hsh|
    rowid += 1
    if rowid == 1
      csv << hsh.keys# adding header row (column labels)
    else
      csv << hsh.values
    end# of if/else inside hsh
  end# of hsh's (rows)
end# of csv open

如果您的数据没有结构化,这显然无效

答案 2 :(得分:20)

如果您有一组数据数组:

rows = [["a1", "a2", "a3"],["b1", "b2", "b3", "b4"], ["c1", "c2", "c3"]]

然后你可以把它写成一个带有以下内容的文件,我觉得这个文件要简单得多:

require "csv"
File.write("ss.csv", rows.map(&:to_csv).join)

答案 3 :(得分:17)

如果有人有兴趣,这里有一些单行(以及关于CSV中类型信息丢失的说明):

"Assertion Failed: A App.Group record was pushed into the store with the value of links being '{}', but links is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer."

注意:CSV会丢失所有类型信息,您可以使用JSON保留基本类型信息,或者转到详细(但更容易人工编辑)YAML以保留所有类型信息 - 例如,如果您需要日期类型,这将成为CSV&amp;中的字符串JSON。

答案 4 :(得分:9)

基于@ boulder_ruby的回答,这就是我正在寻找的,假设us_eco包含来自我的要点的CSV表。

CSV.open('outfile.txt','wb', col_sep: "\t") do |csvfile|
  csvfile << us_eco.first.keys
  us_eco.each do |row|
    csvfile << row.values
  end
end

更新了https://gist.github.com/tamouse/4647196

的要点

答案 5 :(得分:2)

自己挣扎。这是我的看法:

https://gist.github.com/2639448

require 'csv'

class CSV
  def CSV.unparse array
    CSV.generate do |csv|
      array.each { |i| csv << i }
    end
  end
end

CSV.unparse [ %w(your array), %w(goes here) ]