2012-04-08 70 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"; 
} 
相关问题