Probleme traitement de données

Probleme traitement de données - Perl - Programmation

Marsh Posté le 17-09-2006 à 11:47:01    

Bonjour,
 
je suis nouveau de le forum et aussi dans le monde perl,et j'ai besoin de traiter le resultat d'une commande (c'est une commande Tivoli pour generer des inventaires srv) pour les mettres en formes dans un tableau .
 
 
voici le type de données que me renvoi le srv :
 
Query Name: WEB_NATIV_SWARE_QUERY   ==> nom de la query executée (cette ligne doit etre supprimée dans l'affichage)TME_OBJECT_LABEL|PACKAGE_NAME|PACKAGE_VERS ==> Ligne comportant le nom des colonnes
itiva_ep|Batch Operations|4.3.3.78 ==> ligne inventaire pour une machine                            
psta|Netscape Communicator Help - U.S. English|4.7.5.0==> ligne inventaire pour une autre machine
 
la colonne TME_OBJECT represente le nom du serveur inventorié et doit etre affiche en haut de chaque tableau (un tableau par machine)
mais ne doit pas apparaitre à l'interieur de ce meme tableau .
 
Mais la partie importante à savoir est que en fonction de l'inventaire le nombre de colonnes peu changer.
 
ci -joint la partie d'une page cgi qui genere en html un tableau (mais avec des colonnes fixes)
 
#!/usr/bin/perl
#
##################################################################################
#
# OUTIL D'INVENTAIRE WEB Tivoli Inventory
#
# Laurent  04/09/2006
#
##################################################################################
 
##########
#   VAR  #
##########
 
if ($ENV{REQUEST_METHOD} eq "GET" ) {
 $InputArgs = $ENV{QUERY_STRING};
 
    } else {
 $CONTENT_LENGTH = $ENV{'CONTENT_LENGTH'};
 read(STDIN, $InputArgs, $CONTENT_LENGTH);
    }
 
$Task="";
$Host="";
$TaskOption="";
$page_inv="/usr/local/Tivoli/HTTPTiv/AdminPo/admin-cgi/inventory.html";
$queryLib=`. /etc/Tivoli/setup_env.sh ;  wls \@QueryLibrary:itiva.Inventory_Query_ql`;
@QueryLib=split(/\n/,$queryLib);
$aix_system=`. /etc/Tivoli/setup_env.sh ; wlsendpts \@ProfileManager:itiva.INV.aix4-r1-Hardware_scan_pm | awk {'print \$1'}`;
@Aix_system=split(/\n/,$aix_system);
$linux_system=`. /etc/Tivoli/setup_env.sh ; wlsendpts \@ProfileManager:itiva.INV.linux-ix86-Hardware_scan_pm | awk {'print \$1'}`;
@Linux_system=split(/\n/,$linux_system);
$win_system=`. /etc/Tivoli/setup_env.sh ; wlsendpts \@ProfileManager:itiva.INV.w32-ix86-Hardware_scan_pm | awk {'print \$1'}`;
@Win_system=split(/\n/,$win_system);
 
 
##########
#  SUB   #
##########
 
sub RecupArgs {
 @Args=split(/&/,$InputArgs);
 foreach $_ (@Args) {
  $arg=$_;
  #print "ARG : $arg\n";
  if ( $arg =~ /HOST=/ ) {
   $arg =~ s/HOST=//;
   $Host=$arg;
  } elsif ( $arg =~ /QUERY=/ ) {
   $arg =~ s/QUERY=//;
   $Query=$arg;
  } elsif ( $arg =~ /QueryType=/ ) {
   $arg =~ s/QueryType=//;
   $QueryOption=$arg;
  }
 }
}
 
 
sub InvHome {
 open(FH_PAGE_INV,"<$page_inv" );
  while (<FH_PAGE_INV> ) {
   $ligne=$_;
   if ( $ligne =~ /ENDPOINT/ ) {
    print "<OPTION> ## AIX ##";
    foreach $_ (@Aix_system) {
                                 $opt=$_;
                                 print "<OPTION> $opt\n";
                         }
                         print "<OPTION> ## LINUX ##";
    foreach $_ (@Linux_system) {
                                 $opt=$_;
                                 print "<OPTION> $opt\n";
                         }
                         print "<OPTION> ## WINDOWS ##";
    foreach $_ (@Win_system) {
                                 $opt=$_;
                                 print "<OPTION> $opt\n";
                         }
   } elsif ( $ligne =~ /QUERY_TYPE/ ) {
    foreach $_ (@QueryLib) {
                                 $opt=$_;
                                 print "<OPTION> $opt\n";
                         }
                  }else {
    print "$ligne\n";
   }
  }
 close(FH_PAGE_INV);
}
 
 
 
sub RunQuery {
 #$query_host=`. /etc/Tivoli/setup_env.sh ; wqueryinv -n -d \"|\" -q \@$Query $Host `;
 $query_host=`. /etc/Tivoli/setup_env.sh ; wqueryinv  -d \"|\" -q \@$Query $Host `;
 @Query_host=split(/\n/,$query_host);
 $title=@Query_host[1];
  @TITLE= split(/\n/, $title);
  shift @inv;
  $Entete= shift @inv;
  print "$Entete\n";
  SPLIT: foreach $ligne (@inv) {
        print "$ligne\n";
  }
 print "<H1 align='center'> Serveur : $Host </H1>";
 
  #print "<TABLE BORDER='1' align='center' bordercolor='#FFFFFF' bordercolorlight='#99FFFF' bgcolor='#FF6600'><TR><TH width=404' bgcolor='#FFFFFF'>PRODUIT<\/TH><TH div align='center' bgcolor='#FFFFFF'>VERSION<\/TH><\/TR>";
 print "<TABLE BORDER='1' align='center' bordercolor='#FFFFFF' bordercolorlight='#99FFFF' bgcolor='#FF6600'><TR><TH width=404' bgcolor='#FFFFFF'>PRODUIT<\/TH><TH div align='center' bgcolor='#FFFFFF'>VERSION<\/TH><\/TR>";
 foreach $_ (@Query_host) {
  $ligne=$_;
  @Ligne=split(/\|/,$ligne);
  $Ep=shift(@Ligne);
  $Product=shift(@Ligne);
  $Version=shift(@Ligne);
  print "<TR><TD>$Product<\/TD><TD align='center'>$Version<\/TD><\/TR>";
 }
 
 print "<\/TABLE>";
}
 
 
 
 
 
##########
#  MAIN  #
##########
print "Content-Type: text/html\n\n";
 
# RECUPERATION DES ARGUMENT DE LA PAGE WEB
&RecupArgs;
 
# AFFICHAGE DES INDICATEURS
if ( $QueryOption =~ /RunQuery/ ) {
 &RunQuery;
} else {
 &InvHome;
}
 
merci


Message édité par chewbaka2 le 17-09-2006 à 12:08:54
Reply

Marsh Posté le 17-09-2006 à 11:47:01   

Reply

Marsh Posté le 17-09-2006 à 20:03:00    

Et la question est ? [:petrus dei]

Reply

Marsh Posté le 17-09-2006 à 21:27:21    

En fait le but est de generer un tableau dont le colonnes seront differente en fonction des données traitées .
Donc il faut que je cree une page cgi qui puisse traiter celles-ci et les afficher dans une page web .
Non pas comme dans mon exemple qui lui les traitent en dur;
 
 print "<TABLE BORDER='1' align='center' bordercolor='#FFFFFF' bordercolorlight='#99FFFF' bgcolor='#FF6600'><TR><TH width=404' bgcolor='#FFFFFF'>PRODUIT<\/TH><TH div align='center' bgcolor='#FFFFFF'>VERSION<\/TH><\/TR>";  
 foreach $_ (@Query_host) {  
  $ligne=$_;  
  @Ligne=split(/\|/,$ligne);  
  $Ep=shift(@Ligne);  
  $Product=shift(@Ligne);  
  $Version=shift(@Ligne);


Message édité par chewbaka2 le 17-09-2006 à 21:39:37
Reply

Marsh Posté le 17-09-2006 à 23:10:07    

Il te suffit d'écrire une boucle qui parcourt les données de ton tableau, pour l'afficher.
 
Exemple simple, admettons qu'il y ait "PRODUIT|VERSION" dans $ligne :

print "<table border='1' align='center' bordercolor='#FFFFFF' bordercolorlight='#99FFFF' bgcolor='#FF6600'><TR>";
 
foreach my $champ ( split /|/, $ligne )
{
   chomp($champ);
   printf "<th bgcolor='#FFFFFF'>$champ</th>";
}
printf "</tr>";


 
J'espère que cela répond à ta question, parce que j'ai la flemme de lire le code de ton premier post. :o
 
 
edit : au fait, je te suggère l'utilisation du module CGI pour simplifier l'écriture de tes scripts
http://search.cpan.org/~lds/CGI.pm-3.23/CGI.pm


Message édité par Elmoricq le 17-09-2006 à 23:11:29
Reply

Marsh Posté le 18-09-2006 à 10:07:13    

Merci  
 
dans un autre registre il y a-t-il un moyen d'afficher une autre page html avec le resultat depuis une page cgi
 
laurent

Reply

Marsh Posté le 18-09-2006 à 10:12:28    

Je ne comprends pas bien ce que tu veux dire, par "afficher une autre page html" ? :??:

Reply

Marsh Posté le 18-09-2006 à 11:24:14    

Elmoricq a écrit :

Je ne comprends pas bien ce que tu veux dire, par "afficher une autre page html" ? :??:


 
en fait je t'explique:  
 
le mecanisme de ma page cgi :
 
j'execute une commande qui creer par ex un fichier toto.txt.
ensuiste je dois executer (tjrs dans page cgi ) un script java qui va traiter le fichier toto.txt et le mettre au format html  
et pour finir je voudra que ma page cgi fasse  afficher cette page directement.

Reply

Marsh Posté le 18-09-2006 à 13:24:31    

Eh bien le plus simple est d'ouvrir le fichier HTML généré, et d'en afficher le contenu sur la sortie standard.
 
Regarde du côté de open() et de printf().


Message édité par Elmoricq le 18-09-2006 à 13:24:47
Reply

Marsh Posté le 19-09-2006 à 12:40:33    

ok je reviens à la charge  
 
j'ai reussi à extraire la ligne titre pour les colonnes.
et comptabiliser le nombres de champs  
 
 
  $query_host=`. /etc/Tivoli/setup_env.sh ; wqueryinv  -d \"|\" -q \@$Query $Host `;
 @Query_host=split(/\n/,$query_host);
       shift @Query_host;
       $title=@Query_host[0];
       
        foreach $_ ($title) {
        $title_col=$_ ;
        @Title_col=split (/\|/,$title_col);
        shift @Title_col;
                 
  }
la il me met bien de cote la colonne titre  
 
 print "<TABLE BORDER='1' align='center' bordercolor='#FFFFFF' bordercolorlight='#99FFFF' bgcolor='#FF6600'><TR><TH width=100' bgcolor='#FFFFFF'>@Title_col<\/TH>";  
 
ici je lui demande d'afficher dans un tableau Title_col ce qu'il fait.Le bug est qu'il affiche tout dans une seule col .
comment faire pour qu'il affiche dynamiquement chaque col dans une balise <th></th>  
   

Reply

Marsh Posté le 19-09-2006 à 13:38:10    

chewbaka2 a écrit :

ok je reviens à la charge  
 
j'ai reussi à extraire la ligne titre pour les colonnes.
et comptabiliser le nombres de champs  
 
 
  $query_host=`. /etc/Tivoli/setup_env.sh ; wqueryinv  -d \"|\" -q \@$Query $Host `;
 @Query_host=split(/\n/,$query_host);
       shift @Query_host;
       $title=@Query_host[0];
       
        foreach $_ ($title) {
        $title_col=$_ ;
        @Title_col=split (/\|/,$title_col);
        shift @Title_col;
                 
  }
la il me met bien de cote la colonne titre


 
C'est néanmoins alambiqué, je ne comprends pourquoi tu effectues tous ces détours. :/
 
Il suffisait d'écrire :

my $wqueryinv = `. /etc/Tivoli/setup_env.sh ; wqueryinv  -d \"|\" -q \@$Query $Host`;
my @Query_host = split /\n/, $wqueryinv;
 
foreach my $title ( split /|/, @Query_host[1] )
{
   chomp($title);
   printf "<th>$title</th>";
}


 
 

chewbaka2 a écrit :

print "<TABLE BORDER='1' align='center' bordercolor='#FFFFFF' bordercolorlight='#99FFFF' bgcolor='#FF6600'><TR><TH width=100' bgcolor='#FFFFFF'>@Title_col<\/TH>";  
 
ici je lui demande d'afficher dans un tableau Title_col ce qu'il fait.Le bug est qu'il affiche tout dans une seule col .
comment faire pour qu'il affiche dynamiquement chaque col dans une balise <th></th>


 
Normal. Tu lui dis "affiche <th machin> puis l'intégralité de mon tableau puis </th>". Ca  ne marche pas bien. :o
Relis le snippet que j'ai posté plus haut. [:spamafote]


Message édité par Elmoricq le 19-09-2006 à 13:41:29
Reply

Marsh Posté le 19-09-2006 à 13:38:10   

Reply

Marsh Posté le 19-09-2006 à 15:47:18    

Euh  
 
je viens d'essayer et il m'affiche effectivement la ligne titre mais me met une balise <th></th> par lettre. :pt1cable:  
 
as tu une methode pour lui dire que tel donnée est associé à tel colonne .
 
Dois faire le considerer comme un tableau associatif ou pas .
Franchement je suis un peu largué.
 
désolé si j'ai un peu de mal mais je debute alors je comprends plus lentement.
 
merci  

Reply

Marsh Posté le 19-09-2006 à 17:26:24    

En fait voici ce a quoi je voudrai arriver (je l'ai fait en dur sur le code mais je voudrai afficher uniquement le nombre de colonnes presentes  dans le resultat de ma commande).
Dans l'ex j'en ai mis 9 mais il peut en avoir plus ou moins .
Donc comment faire pour que mon script calcule et affiche automatiquement le nombre de colonne à l'arrivée,car pour le moment il affiche le 9 colonnes (normal).

 
  $query_host=`. /etc/Tivoli/setup_env.sh ; wqueryinv  -d \"|\" -q \@$Query $Host `;
 @Query_host=split(/\n/,$query_host);
       shift @Query_host;
       $title=@Query_host[0];
       #SPLIT: foreach $ligne (@Query_host) {
            #print "$ligne\n";
 
        foreach $_ ($title) {
        $title_col=$_ ;
        @Title_col=split (/\|/,$title_col);
        shift @Title_col;
        $taille = scalar (@Title_col);
        $title1=shift (@Title_col);
        $title2=shift (@Title_col);
        $title3=shift (@Title_col);
        $title4=shift (@Title_col);
        $title5=shift (@Title_col);
        $title6=shift (@Title_col);
        $title7=shift (@Title_col);
        $title8=shift (@Title_col);
        $title9=shift (@Title_col);
         
  }
  print "<H1 align='center'> Serveur : $Host </H1>";
  print "<TABLE BORDER='1' align='center' bordercolor='#FFFFFF' bordercolorlight='#99FFFF' bgcolor='#FF6600'><TR><TH width=100' bgcolor='#FFFFFF'>$title1<\/TH><TH width=100' bgcolor='#FFFFFF'>$title2<\/TH><TH width=100' bgcolor='#FFFFFF'>$title3<\/TH><TH width=100' bgcolor='#FFFFFF'>$title4<\/TH><TH width=100' bgcolor='#FFFFFF'>$title5<\/TH><TH width=100' bgcolor='#FFFFFF'>$title6<\/TH><TH width=100' bgcolor='#FFFFFF'>$title7<\/TH><TH width=100' bgcolor='#FFFFFF'>$title8<\/TH><TH width=100' bgcolor='#FFFFFF'>$title9<\/TH>";  
 
   
 
    foreach $_ (@Query_host) {
  $ligne=$_;
    @Ligne=split(/\|/,$ligne);
  $Ep=shift(@Ligne);
    $lign1=shift(@Ligne);
  $lign2=shift(@Ligne);
  $lign3=shift(@Ligne);
  $lign4=shift(@Ligne);
  $lign5=shift(@Ligne);
  $lign6=shift(@Ligne);
  $lign7=shift(@Ligne);
  $lign8=shift(@Ligne);
  $lign9=shift(@Ligne);
   
print "<TR><TD>$lign1<\/TD><TD align='center'>$lign2<\/TD><TD align='center'>$lign3<\/TD><TD align='center'>$lign4<\/TD><TD align='center'>$lign5<\/TD><TD align='center'>$lign6<\/TD><TD align='center'>$lign7<\/TD><TD align='center'>$lign8<\/TD><TD align='center'>$lign9<\/TD><\/TR>";
 }
   
 
 
 print "<\/TABLE>";

 
encore merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed