2015-03-31 47 views
0

我导出了一些文件,导出后实际上有2个文件丢失。 在报告中写道,我导出260个文件,但我只有258个。比较数组以找出差异[Perl中的文件处理]

现在我想检查哪些文件丢失。所以我决定用Perl脚本来尝试它,即使这是我的新手。

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

DATEDATEDATE - 用户出口,计数器 '0000000001':对象: '文件名' 得到了出口。指定用户导出。 文件:'D:\ Work \ Export_Import \ Export \ FILENAME.xml'已导出。

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

谢谢!

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

+0

您在DATEI中更改每一行$ Expo。循环结束时只保留最后一个值。 – choroba 2015-03-31 12:19:55

+0

是的,你每次通过循环重置$ Expo。使用连接运算符'。='而不是'='。尽管...我认为你在这之后仍然有问题。 – beasy 2015-03-31 12:41:27

+0

修复了,谢谢。但是这个问题在逻辑上是另外一个问题。我怀疑我可以使用!〜在这里:D – 0carina 2015-03-31 12:44:00

回答

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论点张开,用词汇瓦尔。
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}; 
} 

请注意,您将不得不测试该正则表达式以从协议文件捕获文件名,因为我没有测试过它。

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

我解决了它。谢谢大家。