X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/621248dee40d10dfad3a464d332c2a879f68bd85..15b2640059:/SL/Helper/Csv.pm diff --git a/SL/Helper/Csv.pm b/SL/Helper/Csv.pm index 50a95faad..c58575afe 100644 --- a/SL/Helper/Csv.pm +++ b/SL/Helper/Csv.pm @@ -202,12 +202,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} || {} }, + 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++; @@ -340,6 +341,9 @@ sub _push_error { $self->_errors(\@new_errors); } +sub specs { + $_[0]->dispatcher->_specs +} 1; @@ -527,22 +531,20 @@ The basic structure is: PROFILE := [ CLASS_PROFILE, CLASS_PROFILE* ] CLASS_PROFILE := { - profile => { ACCESSORS }, + profile => { ACCESSORS+ }, class => $classname, row_ident => $row_ident, + mapping => { MAPPINGS* }, } - ACCESSORS := $field => $accessor, ACCESSORS* + ACCESSORS := $field => $accessor + MAPPINGS := $alias => $field -The C is a HASHREF which may be used to map header fields to custom +The C may be used to map header fields to custom accessors. Example: - [ - { - profile => { - listprice => 'listprice_as_number', - } - } - ] + profile => { + listprice => 'listprice_as_number', + } In this case C will be used to store the values from the C column. @@ -575,7 +577,35 @@ dispatching into it. C is used to determine the correct profile in multiplexed data and must be given there. It's not used in non-multiplexed data. -Example: +If C is present, it must contain a hashref that maps strings to known +fields. This can be used to add custom profiles for known sources, that don't +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: + + profile => { + name => 'name', + description => 'description', + } + mapping => { + name => 'description', + shortname => 'name', + } + +will work as expected, and shortname will not end up in description. This also +works with the case insensitive option. Note however that the case insensitive +option will not enable true unicode collating. + + +Here's a full example: + [ { class => 'SL::DB::Order', @@ -584,7 +614,8 @@ Example: { class => 'SL::DB::OrderItem', row_ident => 'I', - profile => { sellprice => 'sellprice_as_number' } + profile => { sellprice => 'sellprice_as_number' }, + mapping => { 'Verkaufspreis' => 'sellprice' } }, ] @@ -601,6 +632,9 @@ Each entry is an object with the following attributes: Note that the last entry can be off, but will give an estimate. +Error handling is also known to break on new Perl versions and need to be +adjusted from time to time due to changes in Text::CSV_XS. + =head1 CAVEATS =over 4