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

I'm new to programming using PERL and I have a question that I can't seem to find all my answers. What I have is 2 csv files that I want to compare. Each have the same headings but sometimes different data.
For instance:
file1
KellyTerms,LName,FName,...
Kelly,Doe,John,...
Kelly,Doe,Jane,...

file2
KellyTerms,LName,FName,...
Kelly,Hancock,John,...
Kelly,Doe,John,...

What I want to return is the contents of file2. However, when the rows are the same in file1 and file2, I want to add a column to the end of that row to include the words "duplicate".

So for the above examples the output would be
outputfile
KellyTerms,LName,FName,...,Duplicate
Kelly,Hancock,John,...
Kelly,Doe,John,...,Duplicate

Can anyone guide me in the right direction?

Replies are listed 'Best First'.
Re: Comparing 2 csv files
by eff_i_g (Curate) on Aug 18, 2008 at 20:56 UTC
Re: Comparing 2 csv files
by linuxer (Curate) on Aug 18, 2008 at 21:00 UTC
Re: Comparing 2 csv files
by Bloodnok (Vicar) on Aug 19, 2008 at 09:29 UTC
    Hi meredith ,

    You might want to have a look at tillys Text::xSV module...

    A user level that continues to overstate my experience :-))
      I was trying not to get to fancy, this is what I have so far:
      #!/usr/bin/perl $f1 = 'C:\file1.csv'; open FILE1, "$f1" or die "Could not open file $f1\n"; $f2 = 'C:\file2.csv'; open FILE2, "$f2" or die "Could not open file $f2\n"; $outfile = 'C:\output.csv'; open (OUT, ">$outfile") or die "Cannot open $outfile for writing \n"; foreach (<FILE1>) { my @outer_text = $_; @outer_text = split (/,/); if ($outer_text[0] =~ "^Kelly\$") { @outer_text = $_; } seek(FILE2,0,0); foreach (<FILE2>) { my @inner_text = $_; @inner_text = split (/,/); if ($inner_text[0] =~ "^Kelly\$") { if (@outer_text eq @inner_text) { print OUT $_; } } } } close OUT; close FILE1; close FILE2;
        I got it!!!
        #!/usr/bin/perl $f1 = 'C:/f1.csv; open FILE1, "$f1" or die "Could not open file $f1\n"; $f2 = 'C:/f2.csv'; open FILE2, "$f2" or die "Could not open file $f2\n"; $outfile = 'C:/outfile.csv'; open (OUT, ">$outfile") or die "Cannot open $outfile for writing \n"; foreach (<FILE1>){ my @outer_text = split (/,/, $_); if ($outer_text[0] =~ "^Kelly\$") { $status{$outer_text[1].$outer_text[2].$outer_text[10]} = $_; } } close FILE1; foreach (<FILE2>){ @inner_text = split (/,/, $_); $x = ''; $x = $status{$inner_text[1].$inner_text[2].$inner_text[10]}; + if($x gt ''){ print OUT $_; } } close OUT; close FILE2;