2012-06-05 24 views
7

Tôi có mảng 2D này:Làm cách nào để kết xuất mảng 2D trực tiếp vào tệp CSV?

arr = [[1,2],[3,4]] 

tôi thường làm:

CSV.open(file) do |csv| 
    arr.each do |row| 
    csv << row 
    end 
end 

Có cách nào dễ dàng hơn hoặc trực tiếp làm việc đó khác vì thêm từng hàng?

+0

Xem thêm: http://stackoverflow.com/questions/4822422/output-array-to-csv-in-ruby – Phrogz

+1

Những gì bạn có đã khá darn dễ dàng cho bạn lập trình viên. Bạn có (sớm) lo lắng về hiệu suất của việc thêm các hàng một tại một thời điểm? – Phrogz

+0

@Phrogz Không, tôi không lo lắng về hiệu suất. Tôi muốn làm cho cuộc sống dễ dàng hơn nhưng không chắc chắn nếu đã có một cái gì đó tôi có thể sử dụng hoặc tôi sẽ phải làm điều đó bản thân mình. – texasbruce

Trả lời

10

Giả sử rằng mảng của bạn chỉ là con số (không dây có khả năng có dấu phẩy trong họ) thì:

File.open(file,'w'){ |f| f << arr.map{ |row| row.join(',') }.join('\n') } 

Một chuỗi khổng lồ blatted vào đĩa, không có sự tham gia của các thư viện CSV.

Ngoài ra, sử dụng thư viện CSV để correctly escape each row:

require 'csv' 
# #to_csv automatically appends '\n', so we don't need it in #join 
File.open(file,'w'){ |f| f << arr.map(&:to_csv).join } 

Nếu bạn phải làm điều này thường xuyên và mã phiền bạn, bạn có thể monkeypatch nó trong:

class CSV 
    def self.dump_array(array,path,mode="rb",opts={}) 
    open(path,mode,opts){ |csv| array.each{ |row| csv << row } } 
    end 
end 
CSV.dump_array(arr,file) 
+0

Vì vậy, không có phương pháp được xác định trước có thể làm điều đó? Tôi sẽ làm một bản vá khỉ sau đó ... – texasbruce

+0

@texasbruce Việc đọc tài liệu của bạn cũng tốt như tôi. Tôi không thấy một; bạn có khỏe không – Phrogz

+0

Tôi tự tạo cho mình ... – texasbruce

0

Mở rộng câu trả lời trên bởi @Phrogz, trong khi sử dụng thư viện csv và yêu cầu thay đổi dấu phân cách mặc định:

File.open(file,'w'){ |f| f << arr.map{|x| x.to_csv(col_sep: '|')}.join } 
Các vấn đề liên quan