如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)

Posted

技术标签:

【中文标题】如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)【英文标题】:How to check whether one file's value contains in another text file? (perl script)如何检查一个文件的值是否包含在另一个文本文件中? (perl 脚本) 【发布时间】:2020-03-23 09:57:18 【问题描述】:

我想检查一个文件的值是否包含在另一个文件中。如果其中一个值包含,它将显示该特定的现有 bin,如果没有,它将显示没有现有的 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:

如果前 4 个单词的值匹配,则需要检查该行的所有值。 例如,第一个文本文件和第二个文本文件中的 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 语言。非常感谢:)

【问题讨论】:

恐怕我们很难真正理解您的问题,因为您在没有任何上下文的情况下谈论垃圾箱和垃圾箱限制。 【参考方案1】:

根据我的理解,我写了这段代码:

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

我们将读取第一个和第二个文件(DID1DID2)。

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;

如果前四位匹配,则

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

【讨论】:

我认为我们肯定需要更多解释这段代码的作用。 我肯定会做的冠军 谢谢 s-s-r1012,当我尝试运行代码时,出现以下错误 Can't locate ReadWrite.pm in @INC (@INC contains: C:/MTApps/perl/5.12.2/ x64/prod/site/lib C:/MTApps/perl/5.12.2/x64/prod/lib .) 在 test.pl 第 3 行。BEGIN 失败--编译在 test.pl 第 3 行中止。 我尝试安装 cpan beach ,但安装失败 LWP failed with code[500] message[LWP::Protocol::MyFTP: Bad hostname 'mirror.its.uidaho.edu']使用 Net::FTP 获取: 我已经评论了我自己的模块ReadWrite。有意见就没有问题。【参考方案2】:

将搜索模式和数据读入哈希(第一个字段是键),然后遍历数据并仅选择该键的模式中包含的字段。

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

【讨论】:

非常感谢!我已经尝试过这段代码,但出现以下错误 Use of uninitialized value $key in hash element at new1.pl line 37, line 4. @PannPhyuPhway - 我的猜测是您可能有一个空行被读取并且密钥/数据无法从该行中提取。稍后我将在代码中再添加一行,它应该跳过空行。 @PannPhyuPhway -- 请参阅子程序中带有注释的行。尝试再次运行代码。 谢谢!我尝试了代码。没有错误了。但输出只显示一行。它不显示第二行匹配字母。 L84C 有 B:E L84A 有

以上是关于如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是包含列表的任何元素并获取元素的值?

量角器 - 如何检查对象是不是包含在另一个对象中?

如何使用 PHP 检查一个单词是不是包含在另一个字符串中?

我的变量的值在另一个文件中发生变化

如何从 C# 或 Javascript 检查文件是不是存在?

excel中如何检查一列中的内容是不是包含在另一个文档的一列中。