1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| # <CmpCsv>(: fonction de comparaison pour la commande de tri)
# $a et $b sont les variables de tri transmise par la commande de tri "sort"
sub CmpCsv()
{
my @cle_tri = @{$ego->{cle_tri}}; #[cle_tri] tableau des critères colonnes de tri
my $k_a;
my $k_b;
my$col_tri;
@t_a = split (/$szSep/,$a.$szSep);
@t_b = split (/$szSep/,$b.$szSep);
# cas particulier des lignes d'entêtes: elles doivent rester en début de tableau
if( index($t_a[0],"CSV_") > -1 && index($t_b[0],"CSV_") > -1 )
{
if( $csv_ordre{substr($t_a[0],0,8)} < $csv_ordre{substr($t_b[0],0,8)} ) {return -1;}
}
elsif( index($t_a[0],"CSV_TOT") > -1 ) {return 1;} # CSV_TOT en dernière position
elsif( index($t_b[0],"CSV_TOT") > -1 ) {return -1;}
elsif( index($t_a[0],"CSV_") > -1 ) {return -1;}
elsif( index($t_b[0],"CSV_") > -1 ) {return 1;}
else
{
# contruction des chaînes clé de comparaison.
foreach my $r_spe_tri (@cle_tri)
{
$col_tri = ${$r_spe_tri}[0];
if(${$r_spe_tri}[3] == 0) # le critère de tri est une sous-chaîne
{
$elt_a = substr($t_a[$col_tri],${$r_spe_tri}[1],${$r_spe_tri}[2]);
$elt_b = substr($t_b[$col_tri],${$r_spe_tri}[1],${$r_spe_tri}[2]);
}
else
{
$elt_a = $t_a[$col_tri];
$elt_b = $t_b[$col_tri];
}
if(${$r_spe_tri}[4] == 1)
{
$k_a .= $elt_b;
$k_b .= $elt_a;
}
else
{
$k_a .= $elt_a;
$k_b .= $elt_b;
}
}
# comparaison des chaînes clé
$k_a cmp $k_b;
}
} |
Partager