2012-06-05 13 views
7

mam ten 2D tablicy:Jak zrzucić tablicę 2D bezpośrednio do pliku CSV?

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

zwykle zrobić:

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

Czy istnieje łatwiejszy lub bezpośredni sposób robią to inne niż dodawanie wiersz po wierszu?

+0

Zobacz też: http://stackoverflow.com/questions/4822422/output-array-to-csv-in-ruby – Phrogz

+1

To, co masz, jest już bardzo proste dla programisty. Czy jesteś (przedwcześnie) zaniepokojony wydajnością dodawania rzędów po jednym na raz? – Phrogz

+0

@Phrogz Nie Nie martwię się o wydajność. Chcę ułatwić życie, ale nie jestem pewien, czy jest coś, czego mogę użyć, czy też będę musiał to zrobić sam. – texasbruce

Odpowiedz

10

Zakładając, że tablica jest po prostu numery (bez zobowiązań, które potencjalnie mają przecinki w nich), a następnie:

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

Jeden ogromny ciąg blatted na dysku, bez zaangażowania bibliotekę CSV.

Alternatywnie, przy użyciu biblioteki CSV do 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 } 

Jeśli trzeba to robić często i kod przeszkadza, można monkeypatch go:

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

Więc nie ma żadnej predefiniowanej metody, która to potrafi? Zrobię wtedy łatkę małpy ... – texasbruce

+0

@texasbruce Czytanie dokumentów jest tak samo dobre jak moje. Nie widzę; czy ty? – Phrogz

+0

Zrobiłem własną ... – texasbruce

0

Rozszerzanie odpowiedź powyżej przez @Phrogz, podczas korzystania z biblioteki csv i wymagającej zmiany domyślnego separatora:

File.open(file,'w'){ |f| f << arr.map{|x| x.to_csv(col_sep: '|')}.join } 
Powiązane problemy