Dyl*_*kow 302
到文件:
require 'csv'
CSV.open("myfile.csv", "w") do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
# ...
end
Run Code Online (Sandbox Code Playgroud)
到一个字符串:
require 'csv'
csv_string = CSV.generate do |csv|
csv << ["row", "of", "CSV", "data"]
csv << ["another", "row"]
# ...
end
Run Code Online (Sandbox Code Playgroud)
以下是有关CSV的最新文档:http://ruby-doc.org/stdlib/libdoc/csv/rdoc/index.html
bou*_*uby 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"
Run Code Online (Sandbox Code Playgroud)
完成上述所有操作并将其保存到一行csv中.
File.open("ss.csv", "w") {|f| f.write(rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join(""))}
Run Code Online (Sandbox Code Playgroud)
注意:
我认为将活动记录数据库转换为csv就是这样的
CSV.open(fn, 'w') do |csv|
csv << Model.column_names
Model.where(query).each do |m|
csv << m.attributes.values
end
end
Run Code Online (Sandbox Code Playgroud)
嗯@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
Run Code Online (Sandbox Code Playgroud)
如果您的数据没有结构化,这显然不起作用
jwa*_*ack 23
如果您有一组数据数组:
rows = [["a1", "a2", "a3"],["b1", "b2", "b3", "b4"], ["c1", "c2", "c3"]]
Run Code Online (Sandbox Code Playgroud)
然后你可以用以下内容将其写入一个文件,我认为这个更简单:
require "csv"
File.write("ss.csv", rows.map(&:to_csv).join)
Run Code Online (Sandbox Code Playgroud)
Kan*_*zar 20
如果有人有兴趣,这里有一些单行(以及关于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
Run Code Online (Sandbox Code Playgroud)
注意:CSV丢失所有类型信息,您可以使用JSON保留基本类型信息,或者使用详细(但更容易人工编辑)YAML来保留所有类型信息 - 例如,如果您需要日期类型,这将成为CSV和JSON中的字符串.
基于@ 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
Run Code Online (Sandbox Code Playgroud)
更新了要点:https://gist.github.com/tamouse/4647196
| 归档时间: |
|
| 查看次数: |
159881 次 |
| 最近记录: |