2012-06-05 28 views
7

Ho questa matrice 2D:Come scaricare un array 2D direttamente in un file CSV?

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

faccio di solito:

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

Esiste un modo più facile o diretto di farlo altro che aggiungere riga per riga?

+0

Vedi anche: http://stackoverflow.com/questions/4822422/output-array-to-csv-in-ruby – Phrogz

+1

Quello che hai è già abbastanza facile per te il programmatore. Sei (prematuramente) preoccupato per l'esecuzione di aggiungere le righe una alla volta? – Phrogz

+0

@Phrogz No Non mi preoccupo delle prestazioni. Voglio rendere la vita più facile, ma non sono sicuro se c'è già qualcosa che posso usare o dovrò farlo io stesso. – texasbruce

risposta

10

Supponendo che l'array è solo numeri (senza le stringhe che hanno potenzialmente virgole in loro), allora:

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

Un enorme stringa blatted su disco, senza che coinvolge la libreria CSV.

In alternativa, utilizzando la libreria CSV per 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 } 

Se dovete fare questo, spesso e il codice che dà fastidio, si potrebbe monkeypatch in:

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

Quindi non esiste un metodo predefinito che possa farlo? Farò una patch scimmia quindi ... – texasbruce

+0

@texasbruce La tua lettura dei documenti è buona come la mia. Non ne vedo uno; Fai? – Phrogz

+0

Ho creato il mio ... – texasbruce

0

Estendere la risposta di cui sopra di @Phrogz, mentre si utilizza la libreria csv e si richiede di modificare il delimitatore predefinito:

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