http://qs321.pair.com?node_id=800109


in reply to parsing csv with Text::ParseWords

I don't have Text::ParseWords installed on my system now. but tried a re-formulation of your code (untested), yes this last line is trouble!
#!/usr/bin/perl use warnings; use strict; use diagnostics; use Text::ParseWords; my $csvfilename = "data.csv"; open( FILE, "<", $csvfilename" ) or die("Couldn't open CSV file $csvfilename:$!\n"); while ( my $line = <FILE> ) { my @fields = quotewords( ',', 0, $line ); #no & needed! #print will bomb with undef value later if problem #or ( warn "problem on line $.:$_" ); #but maybe you want something like this... warn ("less than 6 things on $line") if @fields <6; my ($id,$brand,$dbt,$cdt,$color,$number) = (@fields)[0..5]; #my ($id,$brand) = (@fields)[0,1]; if all you need is id and brand # print "@fields\n"; #prints all fields space separated print join("\t",@fields),"\n"; #now with tab sparated print "array size = ", scalar(@fields) , "\n"; print "$id\t$brand\n"; }
Update:
So the short version would be like:
#!/usr/bin/perl -w use strict; use diagnostics; use Text::ParseWords; my $csvfilename = "data.csv"; open( FILE, "<", $csvfilename" ) or die("Couldn't open CSV file $csvfilename:$!\n"); while ( my $line = <FILE> ) { my @fields = quotewords( ',', 0, $line ); #no & before #quotewords() needed! my ($id,$brand,) = (@fields)[0,1]; print "$id\t$brand\n"; }

Replies are listed 'Best First'.
Re^2: parsing csv with Text::ParseWords
by GertMT (Hermit) on Oct 09, 2009 at 11:31 UTC

    thank you for the two scripts. Especially the first one really helps me to better understand how to print the various elements of the array.

    the EOL problem remained. I'm only achieving a structured output after opening/saving the 'data.csv'. I'll probably look for another solution (ask different data-file).

    Gert