在Ruby中将数组输出到CSV

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

如果有问题,我使用Ruby 1.9.2。

到一个文件:

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

对一个string:

 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

我已经把这个下来,只有一行。

 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(""))} 

注意:

要将一个活跃的logging数据库转换为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来源,但一般来说,假设在你的arrays中的每个散列具有相同数量的k / v对和键总是相同的,在相同的顺序(即如果你的数据是结构化的),这应该做的事情:

 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 

如果你的数据不结构化,这显然是行不通的

如果任何人有兴趣,这里是一些单行(以及关于CSVtypes信息丢失的一个注释):

 require 'csv' rows = [[1,2,3],[4,5]] # [[1, 2, 3], [4, 5]] # To CSV string csv = rows.map(&:to_csv).join # "1,2,3\n4,5\n" # ... and back, as String[][] rows2 = csv.split("\n").map(&:parse_csv) # [["1", "2", "3"], ["4", "5"]] # File I/O: filename = '/tmp/vsc.csv' # Save to file -- answer to your question IO.write(filename, rows.map(&:to_csv).join) # Read from file # rows3 = IO.read(filename).split("\n").map(&:parse_csv) rows3 = CSV.read(filename) rows3 == rows2 # true rows3 == rows # false 

注意:CSV丢失所有types的信息,您可以使用JSON来保存基本的types信息,或者去详细(但更容易人为编辑)YAML保存所有types的信息 – 例如,如果你需要datetypes,这将成为CSV和JSON中的string。

如果你有一个数组数组:

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

然后你可以用下面的方法把它写到一个文件中,我认为这更简单:

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

build立在@ 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更新了要点;

自己挣扎着。 这是我的承担:

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) ]