Text::CSV::Slurp - CSV Daten aus Dateien so schnell wie möglich einlesen
Veröffentlicht von Thomas Fahle am (Permalink)
Text::CSV::Slurp - convert CSV into an array of hashes, or an array of hashes into CSV von Robbie Bow liest CSV Daten aus Dateien bzw. Dateihandles oder Strings so schnell wie möglich in einen Perl Array of Hashes ein.
Außerdem kann Text::CSV::Slurp auch CSV Dateien erzeugen.
Unter der Haube werkelt Text::CSV, d.h. die zahlreichen Optionen dieses Moduls können ebenfalls verwendet werden.
CSV Daten aus einer Datei lesen
Die Methode load liest CSV-Daten ein. Ohne Angabe von CSV-Optionen werden die Vorgaben von Text::CSV verwendet.
In nachfolgendem Beispiel wird das Semikolon (;) statt des Kommas (,) als Spaltentrenner verwendet.
Die erste Zeile der CSV Daten, oft als Headline bezeichnet, enthält die Spaltenüberschriften (column descriptions). Die Spaltenüberschriften werden als keys der Hashes verwendet.
Beispieldaten:
surname;givenname;phone Meier;Hans;+49 800 ... Schmidt;Susanne;+49 700 ...
In diesem Beispiel werden also surname, givenname und phone als keys genutzt.
#!/usr/bin/perl use strict; use warnings; use Text::CSV::Slurp; my $slurp = Text::CSV::Slurp->new(); my $filename = './1.csv'; # CSV Options - see Text::CSV my %csv_options = ( sep_char => ';', binary => '1', ); # Reference to an array of hashes my $data = $slurp->load( file => $filename, %csv_options ); foreach my $row (@$data) { # $row holds a reference to a hash print "$row->{givenname} $row->{surname} $row->{phone}\n"; }
Das Programm erzeugt folgende Ausgabe:
Hans Meier +49 800 ... Susanne Schmidt +49 700 ...
CSV Daten in eine Datei schreiben
Die Methode create erzeugt CSV-Daten. Hierbei wird einfach der umgegekehrte Weg wie bei load gegangen.
Also erst die passenden Datenstruktur (Array of Hashes) erzeugen und diese an create weiterreichen.
Die Reihenfolge der Ausgabespalten kann mittels field_order festgelegt werden.
CSV Optionen werden, wie gewohnt, an Text::CSV weitergereicht.
#!/usr/bin/perl use strict; use warnings; use Text::CSV::Slurp; my $slurp = Text::CSV::Slurp->new(); # CSV Options - see Text::CSV my %csv_options = ( sep_char => ';', binary => 1, quote_char => '"', always_quote => 1, ); # Reference to an array of hashes my $input = [ { 'first' => 'Otto', 'last' => 'Maier', }, { 'first' => 'Hans', 'last' => 'Huber', }, ]; my @field_order = qw/ last first /; my $csv = $slurp->create( input => $input,field_order => \@field_order, %csv_options ); my $outfile = './test.csv'; my $csv_encoding = 'utf-8'; open my $fh, ">:encoding($csv_encoding)", "$outfile" or die "$!"; print $fh $csv; close($fh);
Das Programm erzeugt folgende Datei:
"last";"first" "Maier";"Otto" "Huber";"Hans"