2009-09-18 23 views

risposta

24

È possibile utilizzare Class:CSV.

use Class::CSV; 

my $csv = Class::CSV->new(
    fields   => [qw/userid username/] 
); 

$csv->add_line([2063, 'testuser']); 
$csv->add_line({ 
    userid => 2064, 
    username => 'testuser2' 
}); 

$csv->print(); 

# 2063,testuser 
# 2064,testuser2 

Edit: Per più librerie, è possibile search CPAN.

17

Usiamo solitamente Text::CSV_XS (che la suddetta Class::CSV si basa su)

UPDATE: Commenters sotto suggeriscono anche usando Text::CSV che caricherà fino Text::CSV_XS o, se questo non è avialable, ripiegare su Text::CSV_PP che non ha la dipendenza da XS e potrebbe essere più facile da installare.

+6

Questa è l'opzione migliore. Testo :: CSV_XS è altamente ottimizzato e ricco di funzionalità con un'API fluida. Lo usiamo dappertutto. L'autore è anche nei miei occhi il più reattivo su tutto il CPAN, è orgoglioso del modulo e fornisce un supporto di prima qualità. Text :: CSV_PP è anche un grande fallback se non puoi compilare per _XS, ottimo se ne hai bisogno in seguito. La cosa giusta accadrà proprio in questi giorni se usi semplicemente Testo :: CSV –

+2

Concordato con quell'ultima frase: usa solo Testo :: CSV e caricherà Text :: CSV_XS se è disponibile o riporterà a Testo :: CSV_PP se il sistema non ha la versione XS installata. –

+1

@szabgab Puoi fornire un esempio di creazione di un CSV con Text :: CSV nella tua risposta? Sto leggendo la documentazione e sembra estremamente concentrato sull'analisi del CSV, non molto chiaro su come crearne uno. –

9

C'è più di un modo per farlo.

  • DBD::CSV - Utilizzare SQL per leggere e scrivere file CSV.
  • Text::CSV - Genera e analizza i file CSV una riga alla volta. Questo è praticamente il - gold standard per la manipolazione CSV.
  • POE::Filter::CSV - Fornisce un filtro CSV per l'IO componente POE.
  • Data::Tabular::Dumper::CSV - Scarica una tabella direttamente in un file CSV (gli oggetti con la stessa interfaccia possono eseguire il dump su file XML o MS Excel).

Ci sono molti altri su CPAN, anche.

Naturalmente, si poteva ignorare tutto questo e basta usare un ciclo, un join e una stampa:

my @table = (
    [ 'a', 'b', 'c'], 
    [ 1, 2, 3 ], 
    [ 2, 4, 6 ], 
); 

for my $row (@table) { 
    print join(',', @$row), "\n"; 
} 

Basta eseguire lo script e reindirizzare output in un file, bang! hai fatto. Oppure potresti impazzire e open un handle di file e stampare direttamente su un file.

Ma in questo caso non si gestiranno campi su più righe, o virgolette incorporate o una delle tante altre stranezze che possono apparire in questo tipo di attività di elaborazione dati. Quindi stai attento con questo approccio.

Le mie raccomandazioni:

  • Se si sta costruendo un'applicazione POE , utilizzano POE :: filtro.
  • Se sei un mostro SQL/DBI e sogna in SQL, o potrebbe essere necessario sostituire l'output CSV con una connessione reale al database , utilizzare DBD :: SQL.
  • Se hai dati semplici e stanno improvvisando un piccolo script cruddy getta nel formato alcuni dati per il foglio di calcolo da digerire, uso di stampa e unirsi - fare questo per nessun codice con una durata prevista di superiore a 2 ore.
  • Se si si desidera scaricare un blob di dati in un uso CSV o XML Dati :: Tabulare :: Dumper :: CSV.
  • Se si sta scrivendo qualcosa che deve essere stabile, gestibile e veloce, e occorre il massimo controllo per input e output, utilizzare Text :: CSV. (Nota che POE :: Filtro :: CSV, Dati :: Tabulare :: Dumper :: CSV e DBD :: CSV utilizzano tutti Testo :: CSV o Testo :: CSV_XS come per l'elaborazione back-end).
Problemi correlati