用Ruby将CSV文件读入数组很容易,但我找不到任何关于如何将数组写入CSV文件的好的文档。有人能告诉我怎么做吗?
如果这很重要的话,我将使用Ruby 1.9.2。
用Ruby将CSV文件读入数组很容易,但我找不到任何关于如何将数组写入CSV文件的好的文档。有人能告诉我怎么做吗?
如果这很重要的话,我将使用Ruby 1.9.2。
当前回答
如果有人感兴趣,这里有一些一行程序(以及关于CSV中类型信息丢失的说明):
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会丢失所有类型信息,您可以使用JSON来保存基本类型信息,或者使用详细的(但更容易人工编辑)YAML来保存所有类型信息——例如,如果您需要日期类型,它将成为CSV和JSON中的字符串。
其他回答
基于@boulder_ruby的答案,这就是我正在寻找的,假设us_eco包含我的gist中的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
如果你有一个数据数组的数组:
rows = [["a1", "a2", "a3"],["b1", "b2", "b3", "b4"], ["c1", "c2", "c3"]]
然后你可以把它写入一个文件,如下所示,我认为这要简单得多:
require "csv"
File.write("ss.csv", rows.map(&:to_csv).join)
到文件:
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
如果有人感兴趣,这里有一些一行程序(以及关于CSV中类型信息丢失的说明):
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会丢失所有类型信息,您可以使用JSON来保存基本类型信息,或者使用详细的(但更容易人工编辑)YAML来保存所有类型信息——例如,如果您需要日期类型,它将成为CSV和JSON中的字符串。
我自己也在挣扎。以下是我的看法:
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) ]