X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FHelper%2FCsv.pm;h=2444225ca370d59ea4f18b8f5f42ce0e97817860;hb=575f3ac727df48ba0ae5624e4de0ff0a7fd9f37f;hp=145b7db3cf4a37eb1ac5b8da60c319c95c4ad742;hpb=a0d9f09a2e63f0be9eda333ab7fa78679ea55759;p=kivitendo-erp.git diff --git a/SL/Helper/Csv.pm b/SL/Helper/Csv.pm index 145b7db3c..2444225ca 100644 --- a/SL/Helper/Csv.pm +++ b/SL/Helper/Csv.pm @@ -158,10 +158,11 @@ sub _check_header { foreach my $p_num (0..$n_header - 1) { my $h = $self->_csv->getline($self->_io); + my ($code, $string, $position, $record, $field) = $self->_csv->error_diag; + $self->_push_error([ $self->_csv->error_input, - $self->_csv->error_diag, - 0, + $code, $string, $position, $record // 0, ]) unless $h; if ($self->is_multiplexed) { @@ -202,13 +203,13 @@ sub _check_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} || {} }, - keys %{ $self->profile->[$p_num]->{mapping} || {} }, + my %names = ( + (map { $_ => $_ } keys %{ $self->profile->[$p_num]->{profile} || {} }), + (map { $_ => $self->profile->[$p_num]{mapping}{$_} } keys %{ $self->profile->[$p_num]->{mapping} || {} }), ); - for my $name (@names) { + for my $name (keys %names) { for my $i (0..$#$h) { - $h->[$i] = $name if lc $h->[$i] eq lc $name; + $h->[$i] = $names{$name} if lc $h->[$i] eq lc $name; } } $p_num++; @@ -259,19 +260,15 @@ sub _parse_data { push @data, \%hr; } else { last if $self->_csv->eof; + # Text::CSV_XS 0.89 added record number to error_diag - if (qv(Text::CSV_XS->VERSION) >= qv('0.89')) { - push @errors, [ - $self->_csv->error_input, - $self->_csv->error_diag, - ]; - } else { - push @errors, [ - $self->_csv->error_input, - $self->_csv->error_diag, - $self->_io->input_line_number, - ]; - } + my ($code, $string, $position, $record, $field) = $self->_csv->error_diag; + + push @errors, [ + $self->_csv->error_input, + $code, $string, $position, + $record // $self->_io->input_line_number, + ]; } last if $self->_csv->eof; } @@ -584,6 +581,9 @@ comply with the expected header identities. Without strict profiles, mappings can also directly map header fields that should end up in the same accessor. +With case insensitive headings, mappings will also modify the headers, to fit +the expected profile. + Mappings can be identical to known fields and will be prefered during lookup, but will not replace the field, meaning that: