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) {
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++;
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;
}
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: