2012-04-08 66 views
-1

我有幾個文件,其中包含用戶名和數據傳輸速率(MB/s)。這些數據收集了一年,並且每個月都將報告保存在12個不同的文件中。我必須合併所有文件以準備最終報告。合併具有相似列條目的兩個文件

文件如下

Filename1 : January 

#User Name   #Data Transferred 

A. Paul      300004 
Jason      600000 
Mayur Pandey    40000 
Kelly H      459000 
Ryan M      349000 


Filename2 : March 

#User Name   #Data Transferred 

Senthl V R     600000 
Mayur Pandey    40000 
Kelly H      459000 
Pratap S     349000 
A. Paul      300004 

同樣地,我有10多個文件。我有所有這些文件合併成一個文件,並最終輸出應該象下面這樣:

Final Report: 

#Username  #January  ....  #March ......... #December  #Total 

A. Paul  300004    300004   Not available 600008 
Pratap S  Not availanble  30000    32000   7899887 
Kelly H  459000    459000   459000  3424448274 
Mayur Pandey 40000     400000   400000  242424442 
Senthl V R  Not available   600000   34544   53546464 
Jason   600000    Not available  3434343  43434355 

我需要一個Perl腳本來自動執行此,而使用Excel或做手工。

這些報告每月生成,名稱不按排序順序存儲。名稱存儲在使用數據傳輸設備的最近用戶中。還有一些情況下用戶在特定的月份中根本沒有使用數據傳輸;在這種情況下,用戶的名稱將不會出現在月度報告文件中。在這種情況下,我必須在月份名稱列中添加不可用

所有字段或列值由\ t TAB分隔並存儲在正常的txt文件中。

謝謝

+0

我無法爲此要求制定任何邏輯。 – PratapSingh 2012-04-08 21:22:17

+1

有什麼要求? – 2012-04-08 22:03:09

回答

1

它比真正困難更復雜。文件名稱將成爲輸出中的列標題。您可能會將命令行中文件名的順序視爲輸出列的順序;否則,你建立了太多的知識。在您閱讀每個文件時,您會將該行分成名稱和編號。你需要一個由名字索引的哈希值,這些值可以是對哈希的引用或對數組的引用。

輸出相對簡單。您決定要顯示名稱(您的示例輸出沒有可識別的命令),然後按照該順序遍歷散列。對於每個條目,您可以在每列中打印值,發現何時存在缺失的條目,並在缺失值時打印「不可用」或附近。您可以隨時累計該行的總數,同樣也可累計總數。

你可能想對數字進行右對齊,而不是左對齊它們。

0

雖然下面的代碼在某個地方不是很聰明,但我認爲它可以解決您的問題。

use warnings; 
my @file_list=("January","February","March","April","May","June","July","August","September","October","November","December"); 
my %priorities=( 
    January=>1, 
    February=>2, 
    March=>3, 
    April=>4, 
    May=>5, 
    June=>6, 
    July=>7, 
    August=>8, 
    September=>9, 
    October=>10, 
    November=>11, 
    December=>12 
);  
my %report_datas=();  
foreach my $file_name (@file_list) { 
    open FH , "<" , $file_name or die("can not open file"); 
    $skip_line=0; 
    while(<FH>) { 
      $skip_line++; 
     next until $skip_line>2; #skip the header(first two lines) 
     chomp; 

     if(/[^\d]+/) {   #get the name 
      $name=$&; 
      $name=~s/\s+$//; #strip the empty chars at the end 
     } 
     if(/[\d]+/) {  #get the transfer data 
      $data=$&; 
     } 

     $month=$file_name; 
     $report_datas{$name}{$month}=$data if not exists $report_datas{$name}{$month}; 
     $report_datas{$name}{"priority"}=$priorities{$month};    #always store the latest month while we are reading file_name from January to December 
    } 
    close FH; 
} 

#sort names by the month of using transfer data 
@sorted_names = sort { $report_datas{$a}{"priority"} <=> $report_datas{$b}{"priority"} } keys %report_datas; 

#print result 
printf "%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s%-18s\n\n","#Username","#January","#February","#March","#April","#May","#June","#July","#August","#September","#October","#November","#December","#Total"; 
foreach my $name (@sorted_names) { 
    my $sum=0; 
    printf "%-18s",$name; 
    foreach my $month (@file_list) { 
     if (exists $report_datas{$name}{$month}) { 
      printf "%-18d",$report_datas{$name}{$month}; 
     $sum+=$report_datas{$name}{$month}; 
     } else { 
     printf "%-18s","Not available"; 
     } 
    } 

    print "$sum\n"; 
} 
相關問題