Ask a Question related to PERL Beginners, Design and Development.
-
Stuart Clemons #1
Need help comparing lines in two files
This very green newbie would like to compare two files, let's say File1
and File2. I
want to put the difference from File2 only, into a new file, File3.
For example:
File1.txt
oranges
apples
bananas
File2.txt
apples
kiwi
bananas
The result I want for File3 is the new entry in File2, which is kiwi. (I
don't care that oranges was in File1 and not File2.)
I tried using a nested foreach loop structure, but I can't get that to
work and I have a feeling using nested foreach's is not the way to go.
I'm guessing somehow I should use hashs, but I've never used a hash for
anything and I don't really know how to use a hash. Can someone help ?
Here's my feeble attempt:
my $file1;
my $file2;
my @file1 = qw(oranges apples bananas);
my @file2 = qw(apples kiwi bananas);
foreach $file2 (@file2){
foreach $file2 (@file2){
#print "$mastervob $tempvob \n";
if ($file2 eq $file1) {
last; # I would like to go up to the
toplevel "foreach" here, but I don't know how to do it
} # and I'm not sure this would even
work.
else{
print "$file2 \n";
}
}
}
Stuart Clemons Guest
-
extra lines at the top of .cfm files
hi forum, in my .cfm files, i have code that is above the starting of the html in the page. when i browse these pages and then do a 'view-... -
[PHP] comparing xml files, removing some html tags
Hi, Discussion of xerces will take us out of the mandate of this list. Please download xerces from http://xml.apache.org along with the documents... -
comparing xml files, removing some html tags
Hi, I need to compare two XML files in order to find if they are "similar", i.e their DOM tree have the same structure. The ideia is to use... -
Comparing directories and files
I have directories with sub directories where the same files have been placed in both areas, with differing dates and updates. How can I "compare"... -
Comparing two files..
Hello everyone! I want to compare two files and get the number of the line where they match! Example: File1.txt a -
Dan Anderson #2
Re: Need help comparing lines in two files
Lets say file 1 is:
foo
bar
.... continues on for 100 lines
And file 2 is:
foo
baz
bar
.... continues on exactly the same 100 lines as file 1
Would file 2 be different from file 1 from line 2 and down? Or would it
be different for line 2 and 3?
Also, the keywords:
next; Brings you to the next iteration in a loop
last; leaves the loop
Should help you iterate through a while loop (or empty loop)
i.e.
{
# this is a loop, just two sets of brackets
# put a last statement and it will leave.
# put one of these in your for loops, or outside of your for loops.
}
Also you can get tricky by naming loops, i.e.:
FOO:
{
print "foo";
BAR:
{
last FOO;
}
# anything below here never executes
print "bar";
}
Dan Anderson Guest
-
Dan Anderson #3
Re: Need help comparing lines in two files
One more thing, those loops I was telling you about, just using a pair
of brackets, also keep their scope. It's a good way to clean up with
yourself, i.e.
my $foo = 40;
{
my $foo = 50;
print $foo; # prints 50
# garbage collector called on all declarations before here
}
print $foo; # prints 40
Also:
use strict;
use warnings;
Should ALWAYS be at that op of your scripts until you know enough Perl
to know when to bend or break this rule.
-Dan
Dan Anderson Guest
-
Wolf Blaum #4
Re: Need help comparing lines in two files
> This very green newbie would like to compare two files, let's say File1
I had a very simliar problem about a week ago, which James answerd here:> and File2. I
> want to put the difference from File2 only, into a new file, File3.
[url]http://groups.google.com/groups?q=Perl+looping+(a+lot+of[/url])
+files&hl=en&lr=&ie=UTF-8&selm=28A16704-4AD3-11D8-9A03-000A95BA45F8%
40grayproductions.net&rnum=1
or try google groups "perl looping through (a lot of) files"
The only really difference is that I didnt want to compare one FILE2 to FILE1
but 500.
However, be carefull on your filesize:
I settled reading one file into mem (as an array) and looping through the
other ones using a while (<FILE2>) reading the 500 files line by line.
why not?> For example:
>
> File1.txt
> oranges
> apples
> bananas
>
> File2.txt
> apples
> kiwi
> bananas
>
> The result I want for File3 is the new entry in File2, which is kiwi. (I
> don't care that oranges was in File1 and not File2.)
>
> I tried using a nested foreach loop structure, but I can't get that to
> work and I have a feeling using nested foreach's is not the way to go.
do you need to associate the contens of the line with a filename ore> I'm guessing somehow I should use hashs, but I've never used a hash for
> anything and I don't really know how to use a hash. Can someone help ?
something? if not, use an array.
As Dan showed:> Here's my feeble attempt:
>
> my $file1;
> my $file2;
>
> my @file1 = qw(oranges apples bananas);
> my @file2 = qw(apples kiwi bananas);
>
FILE2:you may want> foreach $file2 (@file2){
> foreach $file2 (@file2){
foreach my $file1(@file1){
here
as Dan said:> #print "$mastervob $tempvob \n";
> if ($file2 eq $file1) {
> last; # I would like to go up to the
> toplevel "foreach" here, but I don't know how to do it
> } # and I'm not sure this would even
> work.
next FILE2;
will do the job.
This doesent do what I assume you want: when you place the print in the inner> else{
> print "$file2 \n";
> }
> }
> }
loop.
Just look at the link above.
Hope thats a start, Wolf
Wolf Blaum Guest
-
Drieux #5
Re: Need help comparing lines in two files
On Jan 22, 2004, at 4:52 PM, [email]stuart_clemons@us.ibm.com[/email] wrote:
in theory then file2.txt could have been> This very green newbie would like to compare two files, let's say File1
> and File2. I
> want to put the difference from File2 only, into a new file, File3.
>
> For example:
>
> File1.txt
> oranges
> apples
> bananas
>
> File2.txt
> apples
> kiwi
> bananas
>
> The result I want for File3 is the new entry in File2, which is kiwi.
> (I
> don't care that oranges was in File1 and not File2.)
oranges
apples
kiwi
banana
what about
apples
kiwi
wombat
bananas
you would want to have kiwi and wombat
One strategy would be say:
my @file1 = qw(oranges apples bananas);
my @file2 = qw(apples kiwi bananas frodo bagins);
my @list = get_diff_list(\@file1,\@file2);
print "we see $_\n" foreach(@list);
#------------------------
#
sub get_diff_list
{
my ($list1, $list2 ) = @_;
my %hash = map { $_ => 1 } @$list1;
my @ret_list;
foreach (@$list2)
{
if ( $hash{$_} )
{
delete( $hash{$_} );
} else {
push(@ret_list,$_);
}
}
# if you wanted to have the remaining bits that were
# in list1 and not in list2
#push(@ret_list,$_) foreach(keys(%hash));
@ret_list;
} # end of get_diff_list
or how about
sub get_diff_list
{
my ($list1, $list2 ) = @_;
my %hash = map { $_ => 1 } @$list1;
grep { $_ if ( ! exists($hash{$_})) } @$list2;
}
ciao
drieux
---
Drieux Guest
-
Stuart Clemons #6
Re: Need help comparing lines in two files
Thank you Dan and Wolf ! With the suggested changes, my foreach loop
script now works as I hoped it would. (My first script did have a typo,
as you pointed out, though my logic was still wrong.) I'm glad to be able
to set aside my study of hashes for another day. I needed to get this
problem solved so that I can get some other work done.
To correct the script, I added LABELS, used the next statement with a
LABEL, and moved the $print statement out of the inner loop, and waalaa,
it worked properly. I quickly went over the logic of the working program
and it makes sense. It's funny how things seem so clear once they're
solved !
My files are actually probably only 30 to 35 lines each, so size isn't a
problem. The real data I'm comparing has email addresses in them. File2
will either match File1, or have new email addresses in them. I then do
stuff with the new email addresses.
Thanks again. I really appreciate the help.
Here's the working program:
use strict;
use warnings;
my $file1;
my $file2;
my @file1 = qw(oranges apples bananas);
my @file2 = qw(apples kiwi bananas);
FILE2: foreach $file2 (@file2){
FILE1: foreach $file1 (@file1){
if ("$file2" eq "$file1") {
next FILE2;
}
}
print "$file2 \n";
}
The output is "kiwi", which is exactly right.
kiwi
wolf blaum <wolf.blaum@charite.de>
01/22/2004 08:38 PM
To
[email]stuart_clemons@us.ibm.com[/email], [email]beginners@perl.org[/email]
cc
Subject
Re: Need help comparing lines in two files
I had a very simliar problem about a week ago, which James answerd here:> This very green newbie would like to compare two files, let's say File1
> and File2. I
> want to put the difference from File2 only, into a new file, File3.
[url]http://groups.google.com/groups?q=Perl+looping+(a+lot+of[/url])
+files&hl=en&lr=&ie=UTF-8&selm=28A16704-4AD3-11D8-9A03-000A95BA45F8%
40grayproductions.net&rnum=1
or try google groups "perl looping through (a lot of) files"
The only really difference is that I didnt want to compare one FILE2 to
FILE1
but 500.
However, be carefull on your filesize:
I settled reading one file into mem (as an array) and looping through the
other ones using a while (<FILE2>) reading the 500 files line by line.
why not?> For example:
>
> File1.txt
> oranges
> apples
> bananas
>
> File2.txt
> apples
> kiwi
> bananas
>
> The result I want for File3 is the new entry in File2, which is kiwi. (I
> don't care that oranges was in File1 and not File2.)
>
> I tried using a nested foreach loop structure, but I can't get that to
> work and I have a feeling using nested foreach's is not the way to go.
do you need to associate the contens of the line with a filename ore> I'm guessing somehow I should use hashs, but I've never used a hash for
> anything and I don't really know how to use a hash. Can someone help ?
something? if not, use an array.
As Dan showed:> Here's my feeble attempt:
>
> my $file1;
> my $file2;
>
> my @file1 = qw(oranges apples bananas);
> my @file2 = qw(apples kiwi bananas);
>
FILE2:you may want> foreach $file2 (@file2){
> foreach $file2 (@file2){
foreach my $file1(@file1){
here
even> #print "$mastervob $tempvob \n";
> if ($file2 eq $file1) {
> last; # I would like to go up to the
> toplevel "foreach" here, but I don't know how to do it
> } # and I'm not sure this wouldas Dan said:> work.
next FILE2;
will do the job.
This doesent do what I assume you want: when you place the print in the> else{
> print "$file2 \n";
> }
> }
> }
inner
loop.
Just look at the link above.
Hope thats a start, Wolf
Stuart Clemons Guest
-
Eurospace Szarindar #7
RE: Need help comparing lines in two files
Hi Stuart,
Have a look on CPAN ([url]www.cpan.org[/url]) there are two wonderfull packages to do
exactely what you are dreaming of :
Algorithm::Diff
Text::ParagraphDiff
Have a nice day
Michel
-----Message d'origine-----
De: Dan Anderson [mailto:dan@mathjunkies.com]
Date: vendredi 23 janvier 2004 02:17
À: [email]stuart_clemons@us.ibm.com[/email]
Cc: Perl Beginners
Objet: Re: Need help comparing lines in two files
Lets say file 1 is:
foo
bar
... continues on for 100 lines
And file 2 is:
foo
baz
bar
... continues on exactly the same 100 lines as file 1
Would file 2 be different from file 1 from line 2 and down? Or wouldit
be different for line 2 and 3?
Also, the keywords:
next; Brings you to the next iteration in a loop
last; leaves the loop
Should help you iterate through a while loop (or empty loop)
i.e.
{
# this is a loop, just two sets of brackets
# put a last statement and it will leave.
# put one of these in your for loops, or outside of your for loops.
}
Also you can get tricky by naming loops, i.e.:
FOO:
{
print "foo";
BAR:
{
last FOO;
}
# anything below here never executes
print "bar";
}
--
To unsubscribe, e-mail: [email]beginners-unsubscribe@perl.org[/email]
For additional commands, e-mail: [email]beginners-help@perl.org[/email]
<http://learn.perl.org/> <http://learn.perl.org/first-response>
Eurospace Szarindar Guest
-
Stuart Clemons #8
RE: Need help comparing lines in two files
Thanks Michael. I'll take a look at those modules and see if my Perl
skills are sufficient to understand how to use them. Thanks again.
EUROSPACE SZARINDAR <EUROSPACE.SZARINDAR@space.eads.net>
01/23/2004 02:47 AM
To
[email]stuart_clemons@us.ibm.com[/email]
cc
Perl Beginners <beginners@perl.org>
Subject
RE: Need help comparing lines in two files
Hi Stuart,
Have a look on CPAN ([url]www.cpan.org[/url]) there are two wonderfull packages to do
exactely what you are dreaming of :
Algorithm::Diff
Text::ParagraphDiff
Have a nice day
Michel
-----Message d'origine-----
De: Dan Anderson [mailto:dan@mathjunkies.com]
Date: vendredi 23 janvier 2004 02:17
À: [email]stuart_clemons@us.ibm.com[/email]
Cc: Perl Beginners
Objet: Re: Need help comparing lines in two files
Lets say file 1 is:
foo
bar
.... continues on for 100 lines
And file 2 is:
foo
baz
bar
.... continues on exactly the same 100 lines as file 1
Would file 2 be different from file 1 from line 2 and down? Or would it
be different for line 2 and 3?
Also, the keywords:
next; Brings you to the next iteration in a loop
last; leaves the loop
Should help you iterate through a while loop (or empty loop)
i.e.
{
# this is a loop, just two sets of brackets
# put a last statement and it will leave.
# put one of these in your for loops, or outside of your for loops.
}
Also you can get tricky by naming loops, i.e.:
FOO:
{
print "foo";
BAR:
{
last FOO;
}
# anything below here never executes
print "bar";
}
--
To unsubscribe, e-mail: [email]beginners-unsubscribe@perl.org[/email]
For additional commands, e-mail: [email]beginners-help@perl.org[/email]
<http://learn.perl.org/> <http://learn.perl.org/first-response>
Stuart Clemons Guest



Reply With Quote

