2015-03-31 79 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"; 

我解決了它。謝謝大家。