2012-04-11 27 views
0

我想檢查從另一個文件中獲取的服務器名稱是否存在。這個想法是,第二個文件包含多個行,每個文件都包含服務器名稱+其他信息。只匹配一次,但不多於

所以輸出的例子名稱爲「SERVER01」是

server01 
server01 
server01 

我想有隻在輸出xls文件一次中存在的,當然這兩個文件的每個名稱。

該計劃到目前爲止是:

#!/usr/bin/perl -w 


use Spreadsheet::WriteExcel; 

#OPEN FILES 
open(FILE, "CEP06032012.csv") or die("Unable to open CEP file"); 
@CEP_file = <FILE>; 
close(FILE); 

open(FILE, "listsystems_temp") or die("Unable to open listsystems file"); 
@listsystems_file = <FILE>; 
close(FILE); 

#XLS properties 
my $workbook = Spreadsheet::WriteExcel->new('report.xls'); 
my $worksheet_servers = $workbook->add_worksheet(); 


#MAIN 
my $r = 0; 
foreach my $lines(@CEP_file){ 

my @CEP_file = split ";", $lines; 
my $server = $CEP_file[8]; 

foreach my $lines2(@listsystems_file){ 

    if ($lines2 =~ m/.*$server.*/i && $server ne ""){ 
     print "$server \n"; 
     #print "$lines2 \n"; 
     $worksheet_servers->write($r, 0, "$server"); 
     $r++; 
    } 
} 

} 


exit(); 

任何想法如何改變呢?

+1

如何刪除重複是在perlfaq頁之一。 – ikegami 2012-04-11 18:42:25

+0

這些啤酒不完全重複,例如第二個文件包含: 'F_server01:NO - v1' 'F_server01:LZ - v2' 所以每行的部分可以是相同的,但不是所有的行... – f00sa 2012-04-11 18:58:42

+0

你目前正在顯示正在輸出的重複數據,並且您詢問了如何防止這種情況。你在改變你的問題嗎?如果是這樣,你的新問題是什麼? – ikegami 2012-04-11 20:11:06

回答

0

試試這個。這會跳過多次發生的$ server,只保留一個。

my %seen; 

foreach my $lines2(@listsystems_file){ 
    next if $seen{$server}; 
    if ($lines2 =~ m/.*$server.*/i && $server ne ""){ 
     print "$server \n"; 
     #print "$lines2 \n"; 
     $worksheet_servers->write($r, 0, "$server"); 
     $r++; 
     $seen{$server} = 1; 
    } 
} 
相關問題