2012-04-08 4 views
-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 개 더 많은 파일을 가지고

파일입니다. 나는 하나 개의 파일에 모든 파일을 병합해야하고 최종 출력은 다음과 같아야합니다

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을 사용하거나 수동으로 그 일을.

이러한 보고서는 매월 생성되며 이름은 정렬 된 순서로 저장되지 않습니다. 이름은 데이터 전송 기능을 사용하는 최근 사용자에 저장됩니다. 또한 사용자가 특정 달 동안 데이터 전송을 전혀 사용하지 않은 경우도 있습니다. 이 경우 사용자의 이름은 월별 보고서 파일에 나타나지 않습니다. 이 경우 나는 을 달 이름 열에 사용할 수 없습니다.

모든 필드 또는 열 값은 \ 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"; 
} 
관련 문제