Dear All, I have the tab separated csv file with below data.
http://pastebin.com/iDvuhjCc "Asset" "West" "pws" "Asset" "West" "pws" "Asset" "West" "pws" "Asset" "West" "pws" "Asset" "West" "pws" "OnCall" "West" "pws" "OnCall" "West" "pws" "OnCall" "South" "pws" "OnCall" "South" "pws" "OnCall" "South" "pws" "OnCall" "South" "Open" "Onsite" "South" "Open" "Onsite" "South" "Open" "Onsite" "South" "Hold" "Onsite" "East" "Hold" "Onsite" "East" "Hold" "Remote" "East" "Open" "Remote" "East" "Open" "Remote" "East" "Open" "Remote" "East" "Open" "Remote" "North" "Open" "Ven" "North" "Open" "Ven" "North" "Open" "Ven" "North" "Hold" "Ven" "North" "Hold" "Ven" "North" "Hold" "Ven" "North" "Hold" "Remote" "North" "Hold" "Onsite" "North" "Hold" "Asset" "North" "Hold" I have to summarise above date like this: +--------+-----------+-----+------+------+-----+---------+-------+ | reg_id | region_id | pws | open | hold | pwu | re_open | total | +--------+-----------+-----+------+------+-----+---------+-------+ | 0 | 1 | 0 | 4 | 2 | 0 | 0 | 6 | | 1 | 1 | 0 | 3 | 7 | 0 | 0 | 10 | | 2 | 1 | 0 | 3 | 1 | 0 | 0 | 4 | | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | +--------+-----------+-----+------+------+-----+---------+-------+ Where reg_id is : 0 -East 1 -North 2 -South 3 -West I am a C programmer, but very beginner to perl. I wrote the below lengthy script to summarise data in the above format and inserting into mysql database. The function "ByRegion" does the aggregation and summarise data. I think there may other way I will achieve it using perl way. If the below array size increase, my code also will increase: my @Region=('East','North','South','West'); my @Status_String=('Pws','Open','Hold','Pwu','Reopen'); I think, I am doing very bad code in function "ByRegion" for aggrication. I need someone guide to achive this perl way. Any help will be really apricated. #!/usr/bin/perl use Text::CSV; use DBI; # CONFIG VARIABLES my $platform = "mysql"; my $database = "new"; my $host = "localhost"; my $port = "3306"; my $tablename = "by_region"; my $username = "root"; my $password = "root123"; # DATA SOURCE NAME my $dsn = "dbi:$platform:$database:$host:$port"; my @Region=('East','North','South','West'); my @Status_String=('Pws','Open','Hold','Pwu','Reopen'); my @EastCount =(0,0,0,0,0); my @NorthCount =(0,0,0,0,0); my @SouthCount =(0,0,0,0,0); my @WestCount =(0,0,0,0,0); my @Region_Total=(0,0,0,0); sub ByRegion { my @columns=@_; if($columns[1] =~ /^$Region[0]$/) { $EastCount[0]++ if $columns[2] =~ /^$Status_String[0]$/; $EastCount[1]++ if $columns[2] =~ /^$Status_String[1]$/; $EastCount[2]++ if $columns[2] =~ /^$Status_String[2]$/; $EastCount[3]++ if $columns[2] =~ /^$Status_String[3]$/; $EastCount[4]++ if $columns[2] =~ /^$Status_String[4]$/; } elsif($columns[1] =~ /^$Region[1]$/) { $NorthCount[0]++ if $columns[2] =~ /^$Status_String[0]$/; $NorthCount[1]++ if $columns[2] =~ /^$Status_String[1]$/; $NorthCount[2]++ if $columns[2] =~ /^$Status_String[2]$/; $NorthCount[3]++ if $columns[2] =~ /^$Status_String[3]$/; $NorthCount[4]++ if $columns[2] =~ /^$Status_String[4]$/; } elsif($columns[1] =~ /^$Region[2]$/) { $SouthCount[0]++ if $columns[2] =~ /^$Status_String[0]$/; $SouthCount[1]++ if $columns[2] =~ /^$Status_String[1]$/; $SouthCount[2]++ if $columns[2] =~ /^$Status_String[2]$/; $SouthCount[3]++ if $columns[2] =~ /^$Status_String[3]$/; $SouthCount[4]++ if $columns[2] =~ /^$Status_String[4]$/; } elsif($columns[1] =~ /^$Region[3]$/) { $WestCount[0]++ if $columns[2] =~ /^$Status_String[0]$/; $WestCount[1]++ if $columns[2] =~ /^$Status_String[1]$/; $WestCount[2]++ if $columns[2] =~ /^$Status_String[2]$/; $WestCount[3]++ if $columns[2] =~ /^$Status_String[3]$/; $WestCount[4]++ if $columns[2] =~ /^$Status_String[4]$/; } } ############# # reg_id maps: # 0 -East # 1 -North # 2 -South # 3 -West ############ sub InsertByRegion { $Region_Total[0]+=$_ foreach @EastCount; $Region_Total[1]+=$_ foreach @NorthCount; $Region_Total[2]+=$_ foreach @SouthCount; $Region_Total[3]+=$_ foreach @WestCount; my $region_id=1; my @data = ( ['0',$region_id,$EastCount[0],$EastCount[1],$EastCount[2],$EastCount[3],$EastCount[4],$Region_Total[0]], ['1',$region_id,$NorthCount[0],$NorthCount[1],$NorthCount[2],$NorthCount[3],$NorthCount[4],$Region_Total[1]], ['2',$region_id,$SouthCount[0],$SouthCount[1],$SouthCount[2],$SouthCount[3],$SouthCount[4],$Region_Total[2]], ['3',$region_id,$WestCount[0],$WestCount[1],$WestCount[2],$WestCount[3],$WestCount[4],$Region_Total[3]], ); ## PERL DBI CONNECT my $connect = DBI->connect($dsn, $username, $password); ### PREPARE THE QUERY my $query = "INSERT INTO by_region (reg_id,region_id,pws,open,hold,pwu,re_open,total) VALUES (?,?,?,?,?,?,?,?)"; my $query_handle = $connect->prepare($query); ### EXECUTE THE QUERY for my $datum (@data) { $query_handle->execute(@$datum); } } # Over All Pending data File my $oapdata='sample.csv'; my $csv=Text::CSV->new({ sep_char => "\t" }); open(CSV,"<",$oapdata) or die $!; while (<CSV>) { if ($csv->parse($_)) { my @columns = $csv->fields(); ByRegion(@columns); } else { my $err = $csv->error_input; print "Failed to parse line: $err"; } } InsertByRegion; print "The END!!!\n"; close CSV; Thanks for your time. - Mohan L