如何检查一个文件的值是不是包含在另一个文本文件中? (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";
我们将读取第一个和第二个文件(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;
如果前四位匹配,则
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 脚本)的主要内容,如果未能解决你的问题,请参考以下文章