2012-04-08 15 views
-1

ユーザー名とデータ転送速度をMB/s単位で含むファイルがいくつかあります。このデータは1年間収集され、毎月レポートは12の異なるファイルに保存されます。私はすべてのファイルをマージして最終報告書を準備しなければなりません。類似の列エントリを持つ2つのファイルをマージする

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個の以上のファイルを持っているように

ファイルがあります。私は1つのファイルにすべてのこれらのファイルをマージする必要があり、最終的な出力は以下のようにする必要があります:

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 

私は、これはかなりExcelを使用するか、手動でそれをやって自動化するPerlスクリプトを必要としています。

これらのレポートは毎月生成され、名前はソート順に格納されません。名前は、データ転送機能を使用した最近のユーザーに保存されます。また、特定の月にユーザーがデータ転送をまったく使用していない場合もあります。この場合、ユーザーの名前は月次レポートファイルには表示されません。この場合、月名欄にがありませんを追加する必要があります。

すべてのフィールドまたは列の値は、\ t TABで区切られ、通常のtxtファイルに格納されます。

ありがとうございました

+0

この要件のロジックを作成することはできません。 – PratapSingh

+1

どのような要件ですか? –

答えて

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"; 
} 
関連する問題