Revision e95294b5
Von Bernd Bleßmann vor etwa 11 Jahren hinzugefügt
SL/Controller/CsvImport/Base.pm | ||
---|---|---|
|
||
return if ( !$self->csv->header || $self->csv->errors );
|
||
|
||
my $headers = { headers => [ grep { $profile->{$_} } @{ $self->csv->header->[0] } ] };
|
||
my $headers = { headers => [ grep { $profile->{$_} } @{ $self->csv->header } ] };
|
||
$headers->{methods} = [ map { $profile->{$_} } @{ $headers->{headers} } ];
|
||
$headers->{used} = { map { ($_ => 1) } @{ $headers->{headers} } };
|
||
$self->controller->headers($headers);
|
SL/Helper/Csv.pm | ||
---|---|---|
0,
|
||
]) unless $h;
|
||
|
||
push @{ $header }, $h;
|
||
if ($self->is_multiplexed) {
|
||
push @{ $header }, $h;
|
||
} else {
|
||
$header = $h;
|
||
}
|
||
}
|
||
}
|
||
|
||
... | ... | |
# data with a discouraged but valid byte order mark
|
||
# if not removed, the first header field will not be recognized
|
||
if ($header) {
|
||
my $h = $header->[0];
|
||
my $h = ($self->is_multiplexed)? $header->[0] : $header;
|
||
|
||
if ($h && $h->[0] && $self->encoding =~ /utf-?8/i) {
|
||
$h->[0] =~ s/^\x{FEFF}//;
|
||
}
|
||
}
|
||
|
||
# check, if all header fields are parsed well
|
||
return unless $header && all { $_ } @$header;
|
||
if ($self->is_multiplexed) {
|
||
return unless $header && all { $_ } @$header;
|
||
} else {
|
||
return unless $header;
|
||
}
|
||
|
||
# Special case: human stupidity
|
||
# people insist that case sensitivity doesn't exist and try to enter all
|
||
... | ... | |
if ($self->case_insensitive_header) {
|
||
die 'case_insensitive_header is only possible with profile' unless $self->profile;
|
||
if ($header) {
|
||
my $p_num = 0;
|
||
foreach my $h (@{ $header }) {
|
||
my $h_aref = ($self->is_multiplexed)? $header : [ $header ];
|
||
my $p_num = 0;
|
||
foreach my $h (@{ $h_aref }) {
|
||
my @names = (
|
||
keys %{ $self->profile->[$p_num]->{profile} || {} },
|
||
);
|
||
... | ... | |
if ($self->is_multiplexed) {
|
||
return $self->_row_header->{$row->[0]}
|
||
} else {
|
||
return $self->header->[0];
|
||
return $self->header;
|
||
}
|
||
}
|
||
|
||
... | ... | |
sep_char => ',', # default ';'
|
||
quote_char => '\'', # default '"'
|
||
escape_char => '"', # default '"'
|
||
header => [ [qw(id text sellprice word)] ], # see later
|
||
header => [ qw(id text sellprice word) ], # see later
|
||
profile => [ { profile => { sellprice => 'sellprice_as_number'},
|
||
class => 'SL::DB::Part' } ],
|
||
);
|
||
... | ... | |
|
||
=item C<header> \@HEADERS
|
||
|
||
If given, it contains an ARRAYREF for each different class type (i.e. one
|
||
ARRAYREF if the data is only of one class type). These ARRAYREFS are the header
|
||
fields which are an array of columns. In this case the first lines are not used
|
||
as a header. Empty header fields will be ignored in objects.
|
||
If given, it contains an ARRAY of the header fields for not multiplexed data.
|
||
Or an ARRAYREF for each different class type for multiplexed data. These
|
||
ARRAYREFS are the header fields which are an array of columns. In this case
|
||
the first lines are not used as a header. Empty header fields will be ignored
|
||
in objects.
|
||
|
||
If not given, headers are taken from the first n lines of data, where n is the
|
||
number of different class types.
|
||
... | ... | |
Examples:
|
||
|
||
classic data of one type:
|
||
[ [ 'name', 'street', 'zipcode', 'city' ] ]
|
||
[ 'name', 'street', 'zipcode', 'city' ]
|
||
|
||
multiplexed data with two different types
|
||
[ [ 'ordernumber', 'customer', 'transdate' ], [ 'partnumber', 'qty', 'sellprice' ] ]
|
SL/Helper/Csv/Dispatcher.pm | ||
---|---|---|
my @specs;
|
||
|
||
my $csv_profile = $self->_csv->profile;
|
||
my $h_aref = ($self->_csv->is_multiplexed)? $self->_csv->header : [ $self->_csv->header ];
|
||
my $i = 0;
|
||
foreach my $header (@{ $self->_csv->header }) {
|
||
foreach my $header (@{ $h_aref }) {
|
||
my $spec = $self->_parse_profile(profile => $csv_profile->[$i]->{profile},
|
||
class => $csv_profile->[$i]->{class},
|
||
header => $header);
|
t/helper/csv.t | ||
---|---|---|
|
||
my $csv = SL::Helper::Csv->new(
|
||
file => \"Kaffee\n", # " # make emacs happy
|
||
header => [[ 'description' ]],
|
||
header => [ 'description' ],
|
||
profile => [{ class => 'SL::DB::Part', }],
|
||
);
|
||
|
||
... | ... | |
|
||
$csv = SL::Helper::Csv->new(
|
||
file => \"Kaffee;0.12;12,2;1,5234\n", # " # make emacs happy
|
||
header => [[ 'description', 'sellprice', 'lastcost_as_number', 'listprice' ]],
|
||
header => [ 'description', 'sellprice', 'lastcost_as_number', 'listprice' ],
|
||
profile => [{profile => { listprice => 'listprice_as_number' },
|
||
class => 'SL::DB::Part',}],
|
||
);
|
||
... | ... | |
|
||
$csv = SL::Helper::Csv->new(
|
||
file => \"Kaffee", # " # make emacs happy
|
||
header => [[ 'description' ]],
|
||
header => [ 'description' ],
|
||
profile => [{class => 'SL::DB::Part'}],
|
||
);
|
||
$csv->parse;
|
||
... | ... | |
|
||
$csv = SL::Helper::Csv->new(
|
||
file => \"Kaffee", # " # make emacs happy
|
||
header => [[ 'Description' ]],
|
||
header => [ 'Description' ],
|
||
case_insensitive_header => 1,
|
||
profile => [{
|
||
profile => { description => 'description' },
|
||
... | ... | |
|
||
$csv = SL::Helper::Csv->new(
|
||
file => \"Kaffee", # " # make emacs happy
|
||
header => [[ 'Description' ]],
|
||
header => [ 'Description' ],
|
||
profile => [{class => 'SL::DB::Part'}],
|
||
);
|
||
$csv->parse;
|
||
... | ... | |
|
||
$csv = SL::Helper::Csv->new(
|
||
file => \"Kaffee", # " # make emacs happy
|
||
header => [[ 'foo' ]],
|
||
header => [ 'foo' ],
|
||
profile => [{
|
||
profile => { foo => '' },
|
||
class => 'SL::DB::Part',
|
||
... | ... | |
|
||
$csv = SL::Helper::Csv->new(
|
||
file => \"Kaffee", # " # make emacs happy
|
||
header => [[ 'foo' ]],
|
||
header => [ 'foo' ],
|
||
strict_profile => 1,
|
||
profile => [{
|
||
profile => { foo => '' },
|
||
... | ... | |
|
||
$csv = SL::Helper::Csv->new(
|
||
file => \"Phil", # " # make emacs happy
|
||
header => [[ 'CVAR_grOUnDHog' ]],
|
||
header => [ 'CVAR_grOUnDHog' ],
|
||
strict_profile => 1,
|
||
case_insensitive_header => 1,
|
||
profile => [{
|
Auch abrufbar als: Unified diff
Csv-Helper lässt header als einfaches Arrayref bei Nicht-Multiplex-Daten zu.