As you are already familiar with Text::CSV, please keep using its readline instead of falling back to perl's <> method. Things turn nasty quite fast when the CSV contains nested quotation, Unicode or newlines. (This line was updated as GrandFather just copied the use of OP's reading method).
Check if you have installed Text::CSV_XS. Text::CSV is just a wrapper module over Text::CSV_PP and/or Text::CSV_XS. The XS version is about 100 times faster than the PP version and with lots of columns and/or rows, the difference adds up quite fast (see this graph).
update: I extended the speed compare tests with a plain split approach (which obviously breaks on nested sep_char, newlines and other problematic content. Even then Text::CSV_XS can outperform plain perl! See here.
Use the getline method. Do not mix perl's readline (<>) with the parse method.
(Already mentioned) Use three-arg open calls and lexical handles.
Use builtin error reporting (the auto_diag attribute). No need for else-branches at all.
#!/usr/bin/perl use strict; use warnings; use Text::CSV_XS; my $csv = Text::CSV_XS->new ({ binary => 1, # Always do so auto_diag => 1, # Makes finding bugs a whole lot easier }); my $file = "File_name.csv"; # Now you can use it in error reporting open my $fh, "<", $file or die "$file: $!"; # Three-arg open $csv->getline ($fh) for 1, 2; # Skip first two lines while (my $row = $csv->getline ($fh)) { tr/;,/ ./ for @$row; say join "\t" => @$row; } close $fh;
In reply to Re: ideas on how to improve existing code
by Tux
in thread ideas on how to improve existing code
by trolis
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |