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"

 

Siehe auch:

Weitere Posts