-1

ユーザー名とデータ転送速度 (MB/s) を含むファイルがいくつかあります。このデータは 1 年間収集され、月ごとにレポートが 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個のファイルがあります。これらすべてのファイルを 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 スクリプトが必要です。

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

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

ありがとうございました

4

2 に答える 2

1

それは本当に難しいというよりも厄介です。ファイル名は、出力の列見出しになります。コマンドラインでのファイル名の順序は、出力列として表示される順序として扱うことができます。そうでなければ、あなたはあまりにも多くの知識を構築します。各ファイルを読むときに、行を名前と番号に分割します。名前でインデックス付けされたハッシュが必要であり、値はハッシュへの参照または配列への参照のいずれかになります。

出力は比較的簡単です。名前を表示する順序を決定し(サンプル出力には識別可能な順序はありません)、その順序でハッシュをステップ実行します。エントリごとに、各列の値を印刷して、エントリが欠落している場合はそれを特定し、値が欠落している場合は「使用不可」またはその周辺を出力できます。行の合計、および同様に全体の合計を累積できます。

数値を左揃えにするのではなく、右揃えにすることをお勧めします。

于 2012-04-08T22:19:32.153 に答える
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";
}
于 2012-04-09T15:15:02.363 に答える