用Ruby将CSV文件读入数组很容易,但我找不到任何关于如何将数组写入CSV文件的好文档。有人能告诉我怎么做吗?我用的是Ruby 1.9.2。
mfpqipee1#
如果你有一个数据数组数组:
rows = [["a1", "a2", "a3"],["b1", "b2", "b3", "b4"], ["c1", "c2", "c3"]]
然后你可以用下面的代码把它写到一个文件中,我认为这要简单得多:
require "csv" File.write("ss.csv", rows.map(&:to_csv).join)
ws51t4hk2#
我已经把它压缩到一行了。
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对&键总是相同的,以相同的顺序(即,每个哈希值都是相同的)。如果你的数据是结构化的),这应该可以做到:
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
如果您的数据不是结构化的,这显然是行不通的
cxfofazt3#
如果有人感兴趣,这里有一些一行程序(以及关于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来保留基本的类型信息,或者使用verbose(但更容易编辑)YAML来保留所有的类型信息--例如,如果你需要日期类型,它将成为CSV和JSON中的字符串。
yebdmbv44#
基于@boulder_ruby的答案,这就是我要找的,假设us_eco包含我的要点中的CSV表。
us_eco
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的要点
hvvq6cgz5#
我自己也在挣扎。这是我的看法: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) ]
b1uwtaje6#
到文件:
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的最新文档:* (3.1.1之前仅替换1.9.2)*https://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#class-CSV-label-Writing
https://ruby-doc.org/3.2.2/stdlibs/csv/CSV.html
6条答案
按热度按时间mfpqipee1#
如果你有一个数据数组数组:
然后你可以用下面的代码把它写到一个文件中,我认为这要简单得多:
ws51t4hk2#
我已经把它压缩到一行了。
在一行中完成上述所有和保存到csv。
注意事项:
我想,将活动记录数据库转换为csv应该是这样的
嗯,@tamouse,在没有阅读csv源代码的情况下,这一要点对我来说有点混乱,但一般来说,假设数组中的每个哈希都有相同数量的k/v对&键总是相同的,以相同的顺序(即,每个哈希值都是相同的)。如果你的数据是结构化的),这应该可以做到:
如果您的数据不是结构化的,这显然是行不通的
cxfofazt3#
如果有人感兴趣,这里有一些一行程序(以及关于CSV中类型信息丢失的注解):
注意:CSV会丢失所有的类型信息,你可以使用JSON来保留基本的类型信息,或者使用verbose(但更容易编辑)YAML来保留所有的类型信息--例如,如果你需要日期类型,它将成为CSV和JSON中的字符串。
yebdmbv44#
基于@boulder_ruby的答案,这就是我要找的,假设
us_eco
包含我的要点中的CSV表。更新了https://gist.github.com/tamouse/4647196的要点
hvvq6cgz5#
我自己也在挣扎。这是我的看法:
https://gist.github.com/2639448:
b1uwtaje6#
到文件:
转换为字符串:
以下是CSV的最新文档:* (3.1.1之前仅替换1.9.2)*
https://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html#class-CSV-label-Writing
while 3.1.2 up to latest (3.2.2 as this edit).
https://ruby-doc.org/3.2.2/stdlibs/csv/CSV.html