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;
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];
}
}
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;
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;
}