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

I got

-###.####,##.###,"Doe, John & Jane","### Main St","Town, State 13370", +,, -###.####,##.###,"Doe, John","### Main St,"Town, State 13370",,,

and I'm trying to change them to

-###.####,##.###,"John & Jane Doe","### Main St","Town, State 13370",, +, -###.####,##.###,"John Doe","### Main St","Town, State 13370",,,

just messing with the name part. I got

$code =~ s*&*4645654*g; $code =~ s*.([^&]+?),"([^&]+?), ([^&]+?)","*.$1,"$3 $2","*g; $code =~ s*.([^&]+?),"([^&]+?), ([^&]+?) 4645654 ([^&]+?)"*.$1,"$3 464 +5654 $4 $2"*g; $code =~ s*4645654*&*g;

but it's not even close to doing it right. It for example, moves the last name to right before the town name, replaces part of the street number to a period, and moves the Town name to after the Zip code.

How do you get it to only mess with the

.NUMBER,"John & Jane Doe","NUMBER .NUMBER,"Doe, John","NUMBER

part and change it right!

Replies are listed 'Best First'.
Re: Simple search and replace trouble!!
by wind (Priest) on Mar 24, 2011 at 02:02 UTC
    Use Text::CSV
    use Text::CSV; use strict; my $csv = Text::CSV->new({eol => "\n"}) or die "Cannot use CSV: ".Text::CSV->error_diag (); # Open your own files here my $fh = \*DATA; my $out = \*STDOUT; while (my $row = $csv->getline($fh)) { # Translate Name $row->[2] =~ s/(.*?),\s*(.*)/$2 $1/; $csv->print($out, $row); } __DATA__ -###.####,##.###,"Doe, John & Jane","### Main St","Town, State 13370", +,, -###.####,##.###,"Doe, John","### Main St","Town, State 13370",,,
Re: Simple search and replace trouble!!
by GrandFather (Saint) on Mar 24, 2011 at 02:49 UTC

    Use Text::CVS to do the heavy lifting:

    #!/usr/bin/perl -w use strict; use warnings; use Text::CSV; my $csv = Text::CSV->new(); while (defined (my $line = <DATA>)) { next if ! $csv->parse ($line); my @fields = $csv->fields(); $fields[2] = join ' ', reverse split /,\s*/, $fields[2]; $csv->print (*STDOUT, \@fields); print "\n"; } __DATA__ -###.####,##.###,"Doe, John & Jane","### Main St","Town, State 13370", +,, -###.####,##.###,"Doe, John","### Main St","Town, State 13370",,,

    Prints:

    -###.####,##.###,"John & Jane Doe","### Main St","Town, State 13370",, +, -###.####,##.###,"John Doe","### Main St","Town, State 13370",,,

    Note that there was a missing " in the second line of the sample data which I presume was a typo. If it wasn't a typo you've got a bigger problem - your data is corrupt!

    True laziness is hard work