Lookup-Hashes für Header, Klassen und Specs bei Multiplex-Daten benutzen.
authorBernd Blessmann <bibi@online.de>
Wed, 19 Sep 2012 11:20:37 +0000 (13:20 +0200)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Mon, 25 Nov 2013 13:03:09 +0000 (14:03 +0100)
SL/Helper/Csv.pm
SL/Helper/Csv/Dispatcher.pm

index be2e871..e457452 100644 (file)
@@ -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];
   }
 }
 
index ce57809..758981c 100644 (file)
@@ -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;
 }