[Chicago-talk] Simple csv text parsing question

Andrew Rodland arodland at comcast.net
Thu Apr 10 17:32:47 PDT 2008


On Thursday 10 April 2008 01:51:15 pm Mike Ferrari wrote:
> Hi
> So i played with Text::CSV, Text::XS and Text::xSV last night and got
> thoroughly lost :-). each one having its different confusing points.. each
> one saying that they support embedded newlines, each without an explanation
> that i understand. If anyone can point me to an example i would be in your
> debt. I have been beating my head against the wall for 30 or more hours on
> this problem..and its making me question basic simple little things in
> perl... which isn't good.
>
> Nothing like a simple problem to humble you :-)
>
> I started thinking about it this morning, essentially what i need is ..
> when the file is read in i need it to not be broken up by the
> interpretation of the newline characters.
>
> I read up on the $/ "slurp" variable.. which seems to do what i need it to
> do.. not interpret the newlines when taking the data in
>
> I am having a tough time coming up with a regex (i seriously need to sit
> down for a week and work through/understand perl regexes) that will match
> all occurrences of characters with an embedded newline surrounded by
> quotes...
>
> essentially like i have in the following (FIND OPEN QUOTE) could be
> something like /"(.*)  match a quote, followed by any character except
> newline, multiple times ... then a \n  and then ?????  find any character
> except newline, multiple times and then ending with a quote.
> This wont take into account things that are not wrapped in quotes or things
> in quotes with multiple newlines.. which makes me want to lean towards
> using a module and not reinventing the wheel. I am going to sit down and
> reread the perldocs for Text::xSV.

Yeah, regex isn't going to do you a very good job. What you need is this: 
don't read the file yourself, and don't regex. That keeps Text::xSV from 
doing its job decently.

You should just be able to do

my $csv = Text::xSV->new(filename => "whatever.csv");

while (my $row = $csv->get_row) {
	do_stuff_with( @$row );
}



More information about the Chicago-talk mailing list