Tôi đã có này xuống chỉ còn một dòng.
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"
Có phải tất cả những điều trên và tiết kiệm đến một csv, trong một dòng.
File.open("ss.csv", "w") {|f| f.write(rows.inject([]) { |csv, row| csv << CSV.generate_line(row) }.join(""))}
LƯU Ý:
Để chuyển đổi một cơ sở dữ liệu ghi lại hoạt động để csv sẽ là một cái gì đó như thế này tôi nghĩ
CSV.open(fn, 'w') do |csv|
csv << Model.column_names
Model.where(query).each do |m|
csv << m.attributes.values
end
end
Hmm @tamouse, ý chính đó là hơi khó hiểu với tôi không đọc nguồn csv, nhưng nói chung, giả sử mỗi băm trong mảng của bạn có cùng số cặp k/v & rằng các khóa luôn giống nhau, theo thứ tự giống nhau (ví dụ: dữ liệu của bạn có cấu trúc), điều này sẽ làm các hành động:
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
Nếu dữ liệu của bạn không có cấu trúc này rõ ràng sẽ không làm việc
Câu trả lời bạn có thật tuyệt, nhưng hãy để tôi yêu cầu bạn không sử dụng CSV. Nếu bạn không có các tab trong dữ liệu của mình, các tệp được phân tách bằng tab sẽ dễ dàng hơn nhiều để xử lý vì chúng không liên quan đến trích dẫn và thoát khỏi quá nhiều và như vậy. Nếu bạn phải sử dụng CSV, tất nhiên, đó là các điểm ngắt. –
@Bill, mô-đun CSV xử lý gọn gàng các tệp được phân cách bằng tab cũng như tệp csv thực tế. Tùy chọn: col_sep cho phép bạn chỉ định dấu tách cột là "\ t" và tất cả đều tốt. – tamouse
đây là thông tin thêm về CSV http://docs.ruby-lang.org/en/2.1.0/CSV.html –