hujunsimon has asked for the wisdom of the Perl Monks concerning the following question:

Hello Perlmonks,

i have a question for parsing the csv file. i had csv file and have each row like this:

'car reg, location, 'gps string: lats:xxxx,longs:xxxxx, Alts:xxxx', number of satellites fix';

how can i split this into an array, so it has 4 values ? i know how to do this with double quotation, but not sure with single. there must be someway to do it. i also tried the Text::ParseWords, but not sure how to use it with parsing csv file. anyone can help ?

i also attached my code here:
#!/usr/bin/perl use strict; use warnings; use Text::CSV; my $parser = Text::CSV->new(); sub trim($); my $scomma = "@"; my $nline = "\n"; open (TEMP, $file) or die("Error: cannot open $file\n"); open (OUTPUT,">$outfile") or die("Error: cannot open $outfile\n"); while (my $line = <TEMP>) { if ($parser->parse($line)) { my @fields = $parser->fields(); print OUTPUT trim($fields[0]).$scomma.trim($fields[1]).($fields[2] +).$scomma.trim($fields[3]).$scomma.trim($fields[17]).$scomma.trim($fi +elds[18]).$nline; } }
thanks !
  • Comment on How to parse a csv file by comma, but ignore comma inside the single quotation
  • Download Code

Replies are listed 'Best First'.
Re: How to parse a csv file by comma, but ignore comma inside the single quotation
by Tux (Canon) on Aug 03, 2011 at 14:43 UTC

    Besides the obvious that others already correctly posted, please have Text::CSV do the line-endings, not perl:

    my $parser = Text::CSV->new ({ auto_diag => 1, quote_char => "'", allow_loose_quotes => 1, allow_loose_escapes => 1, allow_whitespace => 1, }); open my $fo, ">", $outfile or die "$outfile: $!\n"; open my $fh, "<", $file or die "$file: $!\n"; while (my $row = $csv->getline ($fh)) { print $fo (join "@" => $row->[0], $row->[1] . $row->[2], $row->[3], $row->[17], $row->[18], ), "\n"; }

    Enjoy, Have FUN! H.Merijn
Re: How to parse a csv file by comma, but ignore comma inside the single quotation
by james2vegas (Chaplain) on Aug 03, 2011 at 14:12 UTC
    Is the paste of your file accurate, it doesn't quite match your description? If it is meant to be more like:
    'car reg, location', 'gps string: lats:xxxx,longs:xxxxx, Alts:xxxx', ' +number of satellites fix';
    then passing {quote_char => q<'>, allow_whitespace => 1} to Text::CSV->new should be enough.
      not quite sure how to use {quote_char => q<'>, allow_whitespace => 1}, please explain a bit more !
      sorry, yes i pasted it wrong, :-( !
Re: How to parse a csv file by comma, but ignore comma inside the single quotation
by Anonymous Monk on Aug 03, 2011 at 14:15 UTC
Re: How to parse a csv file by comma, but ignore comma inside the single quotation
by Anonymous Monk on Aug 03, 2011 at 14:09 UTC
    By far the easiest way to do it is with a CPAN module for handling CSV text strings! Of which there are a great many.