in reply to finding commas within commas

All that can be said for this solution is that it works on your test string. Beyond that?

my $str = q["2","T,E,S,T,B","Lazowsky","Mike's","Teststring"]; $str =~ s< \s* ( \"[^\"]+ \" \s* ) (,|$) > < (local $a = $1) =~ tr/,//d; $a . $2 ; >gex; #!" print $str; __END__ #Output C:\test>229505 "2","TESTB","Lazowsky","Mike's","Teststring" C:\test>

Update: Corrected error that LAI++ spotted.

That said, Text::CSV is almost certainly better.


Examine what is said, not who speaks.

The 7th Rule of perl club is -- pearl clubs are easily damaged. Use a diamond club instead.

Replies are listed 'Best First'.
Re^2: finding commas within commas
by LAI (Hermit) on Jan 24, 2003 at 14:15 UTC

    Actually, this breaks if there are commas in the last field. Since you're checking for commas at the end of the field a string like q["2","T,E,S,T,B","Lazowsky","Mike's","Test,string"] will not have the comma in "Test,string" removed.

    Update: BrowserUk++ fixed this. And yes, Text::CSV is a good idea.


    LAI
    :eof
Re: Re: finding commas within commas
by Anonymous Monk on Jan 24, 2003 at 01:56 UTC
    thanks, that seemed to work for me. I was wondering if you could elaborate on how that code works...i'm not too clear on how the code works exactly...
    thanks once again

      Sure. Essentially, this is just a s/// operator. I've used angle brackets instead of slashes as the delimiter.

      $str =~ s< ( # Start capturing (to $1) \s* # Optional whitespace (forgot this before) \" # starting with a quote [^\"]+ # 1 more of anything except a quote \" # another quote \s* # optional white space ) # end capture (,|$) # capture comma seperator (or EOL*) > < # /e option makes this becomes a code block # put the contents of $1 into a localised writable var #($1 is read only!) # and use the tr/// op to remove the commas (local $a = $1) =~ tr/,//d; # The last expression in the block is used as the # replacement expression, so we put the decomma'd localise +d var here. # not forgetting to put back the final comma # If it was there* $a .$2 ; >gex; #!" Global, Execute, ignore whitespace in regex

      The weird comment (#!") I forgot to remove, is just used to keep the syntax parser in my editor happy. Sorry for any confusion it caused.

      Update* Added to correct error spotted by LAI. Use Text::CSV instead.


      Examine what is said, not who speaks.

      The 7th Rule of perl club is -- pearl clubs are easily damaged. Use a diamond club instead.