http://www.perlmonks.org?node_id=1073564


in reply to The future of Text::CSV_XS - TODO

Hi and thanks for this great module,

I was wondering if you could add an option (unless it already exists and I missed it in the documentation).

I am currently dealing with CSV files that were transmitted from a remote computer somewhere in the nature to our server. There are often lines corrupted, meaning they can have more or less values than the header. I want to skip them (because they are corrupted) but not die the program (because next lines are good). I use the bind_columns but when there are more values I get the 3006 error and it gets out of the while. Putting an error_diag right after the while loop and checking for the 3006 error, I can then say goto beginning_of_loop, but this is not the solution I prefer... And I could not check if there was enough values to match the headers...

So what I imagine is an option in the constructor letting the programer choose if the number of columns matches the header (if any) goes on without reporting, make a warning that could go invisible or fetched in error_diag or make the usual error as now (unseen if no auto_diag but dies anyway). But I let you deal with the 'how'...

XN

Replies are listed 'Best First'.
Re^2: The future of Text::CSV_XS - TODO
by Tux (Canon) on Mar 31, 2014 at 12:47 UTC

    As of Text::CSV_XS-1.05, you can catch/ignore any error at your own risk:

    my ($c, $s); sub ignore3006 { my ($err, $msg, $pos, $recno) = @_; if ($err == 3006) { # ignore this error ($c, $s) = (undef, undef); SetDiag (0); } # Any other error return; } # ignore3006 $csv->callbacks (error => \&ignore3006); $csv->bind_columns (\$c, \$s); while ($csv->getline ($fh)) { # Error 3006 will not stop the loop }

    Note that this API is young and new. New insights might enhance or change later on.


    Enjoy, Have FUN! H.Merijn