From: Bernd Blessmann Date: Wed, 19 Sep 2012 11:20:37 +0000 (+0200) Subject: Lookup-Hashes für Header, Klassen und Specs bei Multiplex-Daten benutzen. X-Git-Tag: release-3.1.0beta1~22^2~157 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=7ec8b55e0058fdbecd494ecb9d15022e44d57b24;p=kivitendo-erp.git Lookup-Hashes für Header, Klassen und Specs bei Multiplex-Daten benutzen. --- diff --git a/SL/Helper/Csv.pm b/SL/Helper/Csv.pm index be2e87135..e457452ba 100644 --- a/SL/Helper/Csv.pm +++ b/SL/Helper/Csv.pm @@ -7,12 +7,12 @@ use version 0.77; use Carp; use IO::File; use Params::Validate qw(:all); -use List::MoreUtils qw(all); +use List::MoreUtils qw(all pairwise); use Text::CSV_XS; use Rose::Object::MakeMethods::Generic scalar => [ qw( file encoding sep_char quote_char escape_char header profile numberformat dateformat ignore_unknown_columns strict_profile is_multiplexed - _io _csv _objects _parsed _data _errors all_cvar_configs case_insensitive_header + _row_header _io _csv _objects _parsed _data _errors all_cvar_configs case_insensitive_header ) ]; use SL::Helper::Csv::Dispatcher; @@ -221,17 +221,15 @@ sub _parse_data { sub _header_by_row { my ($self, $row) = @_; - my @header = @{ $self->header }; + # initialize lookup hash if not already done + if ($self->is_multiplexed && ! defined $self->_row_header ) { + $self->_row_header({ pairwise { $a->{row_ident} => $b } @{ $self->profile }, @{ $self->header } }); + } + if ($self->is_multiplexed) { - my $i = 0; - foreach my $profile (@{ $self->profile }) { - if ($row->[0] eq $profile->{row_ident}) { - return $header[$i]; - } - $i++; - } + return $self->_row_header->{$row->[0]} } else { - return $header[0]; + return $self->header->[0]; } } diff --git a/SL/Helper/Csv/Dispatcher.pm b/SL/Helper/Csv/Dispatcher.pm index ce5780916..758981cc9 100644 --- a/SL/Helper/Csv/Dispatcher.pm +++ b/SL/Helper/Csv/Dispatcher.pm @@ -5,8 +5,9 @@ use strict; use Data::Dumper; use Carp; use Scalar::Util qw(weaken); +use List::MoreUtils qw(all pairwise); use Rose::Object::MakeMethods::Generic scalar => [ qw( - _specs _errors + _specs _row_class _row_spec _errors ) ]; use SL::Helper::Csv::Error; @@ -38,48 +39,34 @@ sub dispatch { return $obj; } -# return class for given line -# if only one profile is given, return this profiles class -# if more than one profile is given, identify class by first -# column??? sub _class_by_line { my ($self, $line) = @_; - my $class; + # initialize lookup hash if not already done + if ($self->_csv->is_multiplexed && ! defined $self->_row_class ) { + $self->_row_class({ map { $_->{row_ident} => $_->{class} } @{ $self->_csv->profile } }); + } + if ($self->_csv->is_multiplexed) { - foreach my $p (@{ $self->_csv->profile }) { - my $row_ident = $p->{row_ident}; - if ($line->{datatype} eq $row_ident) { - $class = $p->{class}; - last; - } - } + return $self->_row_class->{$line->{datatype}}; } else { - $class = $self->_csv->profile->[0]->{class}; + return $self->_csv->profile->[0]->{class}; } - - return $class; } sub _specs_by_line { my ($self, $line) = @_; - my $spec; - my $i = 0; + # initialize lookup hash if not already done + if ($self->_csv->is_multiplexed && ! defined $self->_row_spec ) { + $self->_row_spec({ pairwise { $a->{row_ident} => $b } @{ $self->_csv->profile }, @{ $self->_specs } }); + } + if ($self->_csv->is_multiplexed) { - foreach my $p (@{ $self->_csv->profile }) { - my $row_ident = $p->{row_ident}; - if ($line->{datatype} eq $row_ident) { - $spec = $self->_specs->[$i]; - last; - } - $i++; - } + return $self->_row_spec->{$line->{datatype}}; } else { - $spec = $self->_specs->[0]; + return $self->_specs->[0]; } - - return $spec; }