bonjour a tous, avec la grande aide de philou, je suis arrivé au code ci dessous qui me permet (presque) de mettre en forme des données dans l'esprit d'un tableau croisé dynamique excel.

dans mon hash %h et d'apres le code je pensais avoir en clé principale uniquement $data[0] (USER) alors que j'ai aussi $data[1] (ROLE)
(j'explique mieux plus bas)

voici le résultat donné par data dumper :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
%h = (                                                                                                                                 
       'ROLE_B' => {},
       'ROLE_E' => {},
       'ROLE_C' => {},
       'USER_2' => {
                     'ROLE_E' => {
                                   'VA3' => [
                                              0,
                                              0
                                            ],
                                   'V02' => [
                                              0,
                                              0
                                            ],
                                   'FB1' => [
                                              0,
                                              '0',
                                              0
                                            ],
on y voit bien que tout en haut de la hierachie de %h il y a des roles sans descendance (c'est ceux là que je ne souhaite plus voir) et des users avec les roles et les tc associés (résultat attendu).

voici mon fichier TCD :

USER_2 ROLE_D LL3 1
USER_2 ROLE_D FB3 0
USER_2 ROLE_E FB3 1
USER_2 ROLE_E FB1 0
USER_2 ROLE_A ZTA 1
USER_1 ROLE_A ZTA 0
USER_1 ROLE_A VP3 0
USER_1 ROLE_B V23 1
USER_1 ROLE_B VA3 0
USER_1 ROLE_B V02 0
USER_1 ROLE_C VA5 1
USER_1 ROLE_C V23 1


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
52
53
54
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
 
my %h = ();
my @tab_unique_tc = ();
my @tabtc = ();
 
 
 
open(TCD,"tcd") || die ("Erreur d'ouverture de tableau croisé dynamique");
while(<TCD>){
  next if /^$/;
  my @data_tc = split /\s+/;
 
  push (@tabtc,$data_tc[2]);
 
 
}
close TCD;
# effacer les doublons
my %h_tc   = map { $_, 1 } @tabtc;
@tab_unique_tc = sort keys %h_tc;
 
 
open(TCD,"tcd") || die ("Erreur d'ouverture de tableau croisé dynamique");
while(<TCD>){
  next if /^$/;
  my @data = split /\s+/;
 
  push @{$h{$data[0]}->{$data[1]}->{$data[2]}}, $data[3];
 
  foreach my $tc (@tab_unique_tc) {
    push @{$h{$data[0]}->{$data[1]}{$tc}},0 unless exists $h{$data[1]}{$tc};
  }
}
close TCD;
 
print "tc : @tab_unique_tc \n";
 
print Data::Dumper->Dump([\%h], [qw(*h)]);
 
for my $user (keys %h) {
  print "user : $user";
  for my $k(keys %{$h{$user}}){
    print "$k";
    for my $kk(sort keys %{$h{$user}->{$k}}){
    print " ",eval ( join "+",@{$h{$user}->{$k}{$kk}});
    }
print "\n";
  }
print "\n";
}