X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/8a635325ad558d18a2c6930a67e14f5312e91424..c46898c7a2328d211465818380178e25331d8f3c:/SL/Helper/Csv.pm diff --git a/SL/Helper/Csv.pm b/SL/Helper/Csv.pm index 092ba37e8..945758f5d 100644 --- a/SL/Helper/Csv.pm +++ b/SL/Helper/Csv.pm @@ -14,6 +14,7 @@ use Rose::Object::MakeMethods::Generic scalar => [ qw( ) ]; use SL::Helper::Csv::Dispatcher; +use SL::Helper::Csv::Error; # public interface @@ -180,7 +181,7 @@ sub _guess_encoding { sub _push_error { my ($self, @errors) = @_; - my @new_errors = ($self->errors, @errors); + my @new_errors = ($self->errors, map { SL::Helper::Csv::Error->new(@$_) } @errors); $self->_errors(\@new_errors); } @@ -203,15 +204,18 @@ SL::Helper::Csv - take care of csv file uploads file => \$::form->{upload_file}, encoding => 'utf-8', # undef means utf8 sep_char => ',', # default ';' - quote_char => ''', # default '"' - header => [qw(id text sellprice word)] # see later - profile => { sellprice => 'sellprice_as_number' } + quote_char => '\'', # default '"' + escape_char => '"', # default '"' + header => [qw(id text sellprice word)], # see later + profile => { sellprice => 'sellprice_as_number' }, class => 'SL::DB::CsvLine', # if present, map lines to this - ) + ); my $status = $csv->parse; my $hrefs = $csv->get_data; - my @objects = $scv->get_objects; + my @objects = $csv->get_objects; + + my @errors = $csv->errors; =head1 DESCRIPTION @@ -221,8 +225,31 @@ Text::CSV offeres already good functions to get lines out of a csv file, but in most cases you will want those line to be parsed into hashes or even objects, so this model just skips ahead and gives you objects. -Encoding autodetection is not easy, and should not be trusted. Try to avoid it -if possible. +Its basic assumptions are: + +=over 4 + +=item You do know what you expect to be in that csv file. + +This means first and foremost you have knowledge about encoding, number and +date format, csv parameters such as quoting and separation characters. You also +know what content will be in that csv and what L is responsible for +it. You provide valid header columns and their mapping to the objects. + +=item You do NOT know if the csv provider yields to your expectations. + +Stuff that does not work with what you expect should not crash anything, but +give you a hint what went wrong. As a result, if you remeber to check for +errors after each step, you should be fine. + +=item Data does not make sense. It's just data. + +Almost all data imports have some type of constraints. Some data needs to be +unique, other data needs to be connected to existing data sets. This will not +happen here. You will receive a plain mapping of the data into the class tree, +nothing more. + +=back =head1 METHODS @@ -248,7 +275,7 @@ Returns an arrayref of the raw lines as hashrefs. =item C -Return all errors that came up druing parsing. See error handling for detailed +Return all errors that came up during parsing. See error handling for detailed information. =back @@ -265,7 +292,7 @@ scalar ref for memory data. =item C Encoding of the CSV file. Note that this module does not do any encoding -guessing. Know what your data ist. Defaults to utf-8. +guessing. Know what your data is. Defaults to utf-8. =item C @@ -292,7 +319,7 @@ C column. In case of a One-To-One relationsship these can also be set over relationsships by sparating the steps with a dot (C<.>). This will work: - { customer => customer.name } + { customer => 'customer.name' } And will result in something like this: @@ -320,16 +347,13 @@ but deactivated by default. =head1 ERROR HANDLING After parsing a file all errors will be accumulated into C. +Each entry is an object with the following attributes: -Each entry is an arrayref with the following structure: - - [ - 0 offending raw input, - 1 Text::CSV error code if T:C error, 0 else, - 2 error diagnostics, - 3 position in line, - 4 estimated line in file, - ] + raw_input: offending raw input, + code: Text::CSV error code if Text:CSV signalled an error, 0 else, + diag: error diagnostics, + line: position in line, + col: estimated line in file, Note that the last entry can be off, but will give an estimate.