Amount,ChoiceId,Allowed PID,AmountId,MultiplyingFactor,PF new,ServiceTax,ExtraTalkTime,MRP,Recharge Type,FRC/SRC 13,na,285,100,1.1236,81.75,0.02,0,92,Freebie(BA)+PID,Normal 59,na,285,101,1.1236,8.31,0.07,0,10,Freebie(BA)+PID,Normal 13,na,289,100,1.1236,81.75,0.05,0,92,Freebie(BA)+PID,Normal 2001,na,285,103,1.103,27.13,2.06,0,52,MA+DataPack+PID,Normal 1572,na,285,104,na,0,na,na,na,"Blank MRP,rest OK",Normal 1574,na,285,105,na,0,na,na,na,"Blank MRP,rest OK",Normal 333300,na,285,106,1,0,0,0,3333,Freebie(BA)+MA+PID ,Normal 93,na,285,107,1.1236,100.53,0.11,0,114,Freebie(BA)+PID+SA,Normal 78,na,285,108,1.1236,8.12,0.1,0,10,Freebie(BA)+PID,Normal 79,na,285,109,1.1236,85.54,0.1,0,97,BA20 only,Normal 13,na,290,100,1.1236,81.75,0.11,0,92,Freebie(BA)+PID,Normal #### #!/usr/bin/env perl use strict; use warnings; use Data::Table; my $dt = Data::Table::fromCSV("data.csv"); # print "DATA:\n"; # print $dt->csv; # All of the columns except the ones you want to aggregate my $cols = [ 'Amount', 'AmountId', 'MRP', 'ChoiceId', 'MultiplyingFactor', 'PF new', 'ExtraTalkTime', 'Recharge Type', 'FRC/SRC' ]; my $mdt = $dt->melt( $cols ); # print "MELT:\n"; # print $mdt->csv; my $cdt = $mdt->cast( $cols, 'variable', Data::Table::STRING, 'value', \&aggregate ); #print "CAST:\n"; #print $cdt->csv; exit; sub aggregate { my @values = @_; my $av = join(';', @values); return($av); } #### Amount,AmountId,MRP,ChoiceId,MultiplyingFactor,PF new,ExtraTalkTime,Recharge Type,FRC/SRC,Allowed PID,ServiceTax 13,100,92,na,1.1236,81.75,0,Freebie(BA)+PID,Normal,285;289;290,0.02;0.05;0.11 59,101,10,na,1.1236,8.31,0,Freebie(BA)+PID,Normal,285,0.07 2001,103,52,na,1.103,27.13,0,MA+DataPack+PID,Normal,285,2.06 1572,104,na,na,na,0,na,"Blank MRP,rest OK",Normal,285,na 1574,105,na,na,na,0,na,"Blank MRP,rest OK",Normal,285,na 333300,106,3333,na,1,0,0,Freebie(BA)+MA+PID ,Normal,285,0 93,107,114,na,1.1236,100.53,0,Freebie(BA)+PID+SA,Normal,285,0.11 78,108,10,na,1.1236,8.12,0,Freebie(BA)+PID,Normal,285,0.1 79,109,97,na,1.1236,85.54,0,BA20 only,Normal,285,0.1