Как проверить, содержится ли значение одного файла в другом текстовом файле? (perl скрипт) - PullRequest
0 голосов
/ 23 марта 2020

Я хотел бы проверить, что одно из значений файла содержится в другом файле. если одно из значений содержит его, это покажет, что существует существующее bin для этого специфика c, если нет, это покажет, что не существует никакого существующего предела bin. проблема в том, что я не уверен, как проверить все значения сразу.

первое значение текстового файла DID1 содержит:

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

второе значение текстового файла DID содержит:

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:

если первые значения 4words совпадают, необходимо проверить все значения для этой строки. например, L84A в первом текстовом файле и во втором текстовом файле имеет значение M. он должен распечатать, есть существующий M bin

ниже мой код:

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";
                }
            }
        }
    }
}

Я не могу проверить все значения. Пожалуйста, помогите дать какие-либо советы по этому вопросу, поскольку я впервые изучаю язык perl. Большое спасибо:)

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Исходя из моего понимания, я пишу этот код:

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";

Мы собираемся прочитать как первый, так и второй файлы (DID1 и DID2).

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

В первом файле, согласно запросу OP, первые четыре символа должны быть сопоставлены со вторым файлом, а затем, если они совпадают, нам нужно проверить остальные символы в первом файле со вторым.

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;

Если первые четыре di git совпадают, тогда

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

Сохраняет остальное содержимое в том же виде и разделяется двоеточиями и получает символы для сопоставления с первым содержимым файла.

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

Затем ищите каждую букву по первому и второму содержимому, которое соответствует строке ...

        foreach my $sngletter(@First_values)
        {

Если буквы сопоставляются с первым и вторым файлом, оно будет напечатано.

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

Это просто информация о том, что конец строки.

    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);
}
0 голосов
/ 23 марта 2020

Считать шаблон поиска и данные в га sh (первое поле - это ключ), затем go через данные и выбрать только поле, включенное в шаблон для этого ключа.

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;
}

Выход

L84C has B:E
L84A has M
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...