SPUG:use Text::CSV?

Adam Monsen adamm at wazamatta.com
Thu Feb 27 03:13:53 CST 2003


Michael R. Wolf wrote:
> Text::CSV->combine() seems to be broken.  I've always seen the
> module, but just had a chance to use it.  Boy was I disappointed.

May be related to something in the CAVEATS section in the perldoc:

   "1. Allowable characters within a CSV field include 0x09
   (tab) and the inclusive range of 0x20 (space) through
   0x7E (tilde)."

usually this is the culprit. Everything but these ASCII characters must 
be stripped.

   #!/usr/bin/perl -w
   use Text::CSV_XS;
   use strict;

   my @fields = ('foo', "bar\nblah", "ba^Lz");
   $_ =~ tr/\x09\x20-\x7E/ /c for @fields;

   my $csv = Text::CSV_XS->new({always_quote => 1});
   if ($csv->combine(@fields)) {
     my $string = $csv->string;
     print $string, "\n";
   } else {
     my $err = $csv->error_input;
     print "combine() failed on argument: ", $err, "\n";
   }

To really see the test work, ^L needs to be re-entered as a literal 
CTRL-L, not just a carat followed by an L. It's not uncommon to see 
strange characters if the input for the combine() call was cut and 
pasted from MS Word on a Mac or PC into an HTML form.

> Should I even be using Text::CSV, or is there something that's beyond
> version 0.01, and therefore better, to read/write CSV files?

If you don't mind using C, I'd use Text::CSV_XS, it's a helluva lot
faster than Text::CSV.

DBD::CSV looks cool too, but I haven't tried it.




More information about the spug-list mailing list