比较数组以找到差异[Perl中的文件处理]

时间:2015-03-31 12:09:49

标签: arrays perl design-patterns matching

我导出了一些文件,导出后实际上有2个文件丢失。 在报告中写道,我导出了260个文件,但我只有258个。

现在我想检查哪个文件丢失了。因此我决定使用Perl脚本尝试它,即使对我来说也是新手。

出口协议看起来像这样......

  

DATEDATEDATE - USER EXPORT,counter&00; 0000000001':对象:   ' FILENAME'出口了。 DATEDATEDATE- USER EXPORT。   文件:' D:\ Work \ Export_Import \ Export \ FILENAME.xml'出口。

唯一重要的事情是文件名:]

谢谢!

编辑:解决了它。向下滚动:]

3 个答案:

答案 0 :(得分:0)

问题的根源是这一行:

$Expo = $Export . $_;

您将所有文件名连接成一个单独的标量,但它不能很好地工作。因为您只有最后一个... ...特别是如果$Export是一个目录,那么您尝试将其作为文件打开。

我可以建议使用File::Find吗?有点像这样:

#!C:\Strawberry\perl\bin\perl.exe

#Pragmas
use strict;
use warnings;

my %files_in_dir;
my %files_in_export;

my $dir_name    = '/path/to/dir';
my $export_name = 'filename_here';

sub find_files {
    if (-f) {
        $files_in_dir{$_} = $File::Find::name;
    }
}

find( \&find_files, $dir_name );

#Open Export File
open( my $datei, "<", "$export_name" ) or die $!;
while ( my $filename = <$datei> ) {
    chomp($filename);
    if ( $files_in_dir{$filename} ) {
        print "$filename in $files_in_dir{$filename}\n";
    }
    else {
        print "No $filename found\n";
    }
}
close($datei);

我还建议:

  • 使用3个参数打开,使用词汇变量。

答案 1 :(得分:0)

创建成功导出文件的哈希索引(假设所有文件都在一个目录中,并且完整路径并不重要):

my $dir = 'some/dir';
opendir my $dh, $dir;
my @files = readdir $dh;   
my %index;
$index{$_} = 1 foreach @files;

现在迭代“协议”文件并捕获每行上的导出文件名。使用该文件名来查看它是否作为您之前创建的哈希中的键存在。

# open your protocol file, then...
while (<$protocol_fh>) {
    my $exported = $1 if $_ =~ /([^\/]+\.xml)/;
    print "$exported was not found in $dir\n" if ! $index{$exported};
}

请注意,您必须测试该正则表达式以从协议文件中捕获文件名,因为我还没有对其进行测试。

答案 2 :(得分:0)

#Pragmas
use strict;
use warnings;

#Variablen
my $dir_name ='PathToDir';
my $export_name ='File.txt';

my $re1 = '.*?';
my $re2 = '((?:[a-z][a-z\\.\\d_]+)\\.(?:[a-z\\d]{3}))(?![\\w\\.])';
my @array1;
my @array2;
my $fqdn1;
my @diff;
my @isect;
my $item;
my %count;

#Open Report
open( my $fh, '<', $export_name )
  or die "Could not open file '$export_name' $!";

    while ( my $row = <$fh> ) {
    chomp $row;
    my $re = $re1 . $re2;
    if ( $row =~ m/$re/is ) {
        $fqdn1 = $1;

        if ( $fqdn1 =~ m/xml/ ) {
            push( @array1, $fqdn1 );
        }
    }

}
close($fh);

#Open Directory
opendir DIR, $dir_name;
@array2 = grep !/^\.\.?$/, readdir(DIR);
close(DIR);

#Searching the difference
@isect = ();
@diff  = ();
%count = ();

foreach $item ( @array1, @array2 ) { $count{$item}++; }

foreach $item ( keys %count ) {
    if ( $count{$item} == 2 ) {
        push @isect, $item;
    }
    else {
        push @diff, $item;
    }
}

#Output
print "Missing Filenames = @diff\n\n";

# print "\nA Array = @array1\n";
# print "\nB Array = @array2\n";
# print "\nIntersect Array = @isect\n";

我解决了。谢谢大家。