Pann Phyu Phway
Pann Phyu Phway

Reputation: 55

How to check whether one file's value contains in another text file? (perl script)

I would like to check one of the file's values contains on another file. if one of the value contains it will show there is existing bin for that specific, if no, it will show there is no existing bin limit. the problem is I am not sure how to check all values at once.

first DID1 text file value contain :

L84A:D:O:M:
L84C:B:E:D:

second DID text file value contain :

L84A:B:E:Q:X:F:i:M:Y:
L84C:B:E:Q:X:F:i:M:Y:
L83A:B:E:Q:X:F:i:M:Y:

if first 4words value are match, need to check all value for that line. for example L84A in first text file & second text file value has M . it should print out there is an existing M bin

below is my code :

use strict;
use warnings;
my $filename  = 'DID.txt';
my $filename1 = 'DID1.txt';
my $count     = 0;
open( FILE2, "<$filename1" )
  or die("Could not open log file. $!\n");
while (<FILE2>) {
    my ($number) = $_;
    chomp($number);
    my @values1 = split( ':', $number );
    open( FILE, "<$filename" )
      or die("Could not open log file. $!\n");
    while (<FILE>) {
        my ($line) = $_;
        chomp($line);
        my @values = split( ':', $line );

        foreach my $val (@values) {
            if ( $val =~ /$values1[0]/ ) {
                $count++;
                if ( $values[$count] =~ /$values1[$count]/ ) {
                    print
                      "Yes ,There is an existing bin & DID\n @values1\n";
                }
                else {
                    print "No, There is an existing bin & DID\n";
                }
            }
        }
    }
}

I cannot check all value. please help to give any advice on it since this is my first time learning for perl language. Thanks a lot :)

Upvotes: 0

Views: 1005

Answers (2)

ssr1012
ssr1012

Reputation: 2589

Based on my understanding I write this code:

use strict;
use warnings;
#use ReadWrite;
use Array::Utils qw(:all);

use vars qw($my1file $myfile1cnt $my2file $myfile2cnt @output);

$my1file = "did1.txt";  $my2file = "did2.txt";

We are going to read both first and second files (DID1 and DID2).

readFileinString($my1file, \$myfile1cnt); readFileinString($my2file, \$myfile2cnt);

In first file, as per the OP's request the first four characters should be matched with second file and then if they matched we need to check rest of the characters in the first file with the second one.

while($myfile1cnt=~m/^((\w){4})\:([^\n]+)$/mig)
{
    print "<LineStart>";
    my $lineChk = $1; my $full_Line = $3; #print ": $full_Line\n";
    my @First_values = split /\:/, $full_Line; #print join "\n", @First_values;

If the first four digit matched then,

    if($myfile2cnt=~m/^$lineChk\:([^\n]+)$/m)
    {

Storing the rest of the content in the same and to be split with colon and getting the characters to be matched with first file contents.

        my $FullLine = $1;  my @second_values = split /:/, $FullLine;

Then search each letter first and second content which matched line...

        foreach my $sngletter(@First_values)
        {

If the letters are matched with first and second file its going to be printed.

            if( grep {$_ eq "$sngletter"} @second_values)
            {
                print "Matched: $sngletter\t";
            }
        }
    }
    else {  print "Not Matched...";  }

This is just information that the line end.

    print "<LineEnd>\n"
}

#------------------>Reading a file
sub readFileinString
#------------------>
{
    my $File = shift;
    my $string = shift;
    use File::Basename;
    my $filenames = basename($File);

    open(FILE1, "<$File") or die "\nFailed Reading File: [$File]\n\tReason: $!";
    read(FILE1, $$string, -s $File, 0);
    close(FILE1);
}

Upvotes: 2

Polar Bear
Polar Bear

Reputation: 6818

Read search pattern and data into hash (first field is a key), then go through data and select only field included into pattern for this key.

use strict;
use warnings;
use feature 'say';

my $input1 = 'DID1.txt';                      # look for key,pattern(array)
my $input2 = 'DID.txt';                       # data - key,elements(array)

my $pattern;
my $data;
my %result;

$pattern    = file2hash($input1);             # read pattern into hash
$data       = file2hash($input2);             # read data into hash

while( my($k,$v) = each %{$data} ) {          # walk through data
    next unless defined $pattern->{$k};       # skip those which is not in pattern hash
    my $find = join '|', @{ $pattern->{$k} }; # form search pattern for grep
    my @found = grep {/$find/} @{ $v };       # extract only those of interest
    $result{$k} = \@found;                    # store in result hash
}

while( my($k,$v) = each %result ) {           # walk through result hash 
    say "$k has " . join ':', @{ $v };        # output final result
}

sub file2hash {
    my $filename = shift;
    my %hash;
    my $fh;

    open $fh, '<', $filename
        or die "Couldn't open $filename";

    while(<$fh>) {
        chomp;
        next if /^\s*$/;                      # skip empty lines
        my($key,@data) = split ':';
        $hash{$key} = \@data;
    }

    close $fh;

    return \%hash;
}

Output

L84C has B:E
L84A has M

Upvotes: 0

Related Questions