IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Aide sur finition sur Script Traitement de données


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut Aide sur finition sur Script Traitement de données
    Bonjour à tous,

    Suite à la recommandation de Lolo78, j'ouvre une nouvelle discusion pour plus de visibilité.

    Vous trouverez ci-joint :
    - Mes données
    - Mon script
    - Le résultat de mon script
    - Le résultat attendu

    Petit résumé "pratique de mon script" :
    Comme vous l'avez compris mon script lit 4 fichiers pour en ressortir des données. Principalement "name" et "capacity"
    Pour le moment, il commence à collecter les données dés qu'il voit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^id:name:IO_group_id:/;
    Il fait un tas de test pour les grouper par types, etc. bref vous allez comprendre en chechant les données et résultat.

    Et voici ce que j'aimerai faire/ce qu'il me manque :
    Voilà les deux éléments qu'ils me manquent :

    1) Comme dis plus haut, je passe tant qu'il ne voit pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /^id:name:IO_group_id:/;
    (ne manière très simplifié). Maintenant le soucis c'est que j'ai besoin également de ce qui a avant cette ligne dans mon fichier de données.
    Donc dans le fichier de données, je dois récupérer ceci aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    id:name:status:mdisk_count:vdisk_count:capacity:extent_size:free_capacity:virtual_capacity:used_capacity:real_capacity:overallocation:warning:easy_tier:easy_tier_status:compression_active:compression_virtual_capacity:compression_compressed_capacity:compression_uncompressed_capacity:parent_mdisk_grp_id:parent_mdisk_grp_name:child_mdisk_grp_count:child_mdisk_grp_capacity:type:encrypt:owner_type:site_id:site_name
    0:NBB2_CORP_DS8K8:online:38:252:124.98TB:1024:9.39TB:115.59TB:115.58TB:115.58TB:92:90:on:active:yes:5.00GB:3.28MB:0.00MB:0:NBB2_CORP_DS8K8:0:0.00MB:parent:no:none::
    1:MigrationPool_8192:online:0:0:0:1024:0:0.00MB:0.00MB:0.00MB:0:80:auto:balanced:no:0.00MB:0.00MB:0.00MB:1:MigrationPool_8192:0:0.00MB:parent::none::
    Le soucis que j'ai, c'est que, ici je dois récupérer 3 valeurs : name, capacity et free_capacity. Et évidemment, ce n'est pas les mêmes positions que la suite des données (sinon ça aurait été très simple ...). Mon soucis est : Comment pouvoir séparer la lecture des deux ?

    Je ne veux pas les travailler comme ce qui est présent actuellement dans mon fichier EXCEL, ce que je veux, c'est juste récupérer le "name", "capacity" et "free_capacity" de ces lignes et les afficher ensuite bêtement dans mon Excel.

    2) A un moment, dans mon script, je crée une sorte de catégorie "Other", pour en faire un total.
    J'aimerai, en plus de continuer ceci, pouvoir les afficher ailleurs dans mon script (Name + capacity). Je n'y arrive pas du tout ...

    Voilà, désolé, je ne suis pas très bon en explication par écrit.
    Si vous n'avez pas compris quelque chose, n'hésitez pas, ce n'est pas vous qui n'avez pas compris, c'est surement moi qui ai mal expliqué

    Merci d'avance !
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    dans la première partie de ton fichier, il y a six lignes au format spécial dont tu parles (sans compter l'entête). Est-ce que tu veux récupérer les valeurs de toutes ces lignes, et éventuellement les associer au numéro d'ID? Ou seulement la première de ces lignes? Ou autre chose?

  3. #3
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Bonjour Lolo,

    Je veux toutes les récupérer mais traiter uniquement name, capacity et free_capacity.
    C'est suffisant comme réponse ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    est-ce suffisant? Oui et non. Oui pour présenter un algo général de lecture du fichier, mais pas plus que cela, puisque je ne sais pas ce que tu veux faire avec ces données ensuite.

    Une solution possible simple est de lire le contenu du fichier dans une première boucle while traitant la première série de lignes et de sortir de cette boucle while pour embrayer avec la boucle qui existe déjà quand tu rencontres une ligne reconnue par /^id:name:IO_group_id:/ :
    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
     
    my $fichier = shift;
    open my $FH, "<", $fichier or die "Ouverture impossible du fichier $fichier";
    my %count;
    # my $saut = 1;  # n'est plus nécessaire
     
    my %header_values;
    while  (my $line = <$FH>) {                               # première boucle pour lire le premier groupe de lignes
        last if $line =~ /^id:name:IO_group_id:/;             # sort de cette boucle et passe à la suivante pour la suite des données
        next if $line =~/id:name:status:mdisk_count:/;        # saute la ligne d'entête
        next if $line =~ /^\s*$/;                             # saute d'éventuelles lignes vides
        my ($id, $name, $capacity, $free) = (split /:/, $line)[0, 1, 5, 7];
        $header_value{$id} = { name => $name, capacity => $capacity, free_capacity => $free}; # stockage des valeurs qui t'intéressent dans un hash
    }
     
    while (my $line = <$FH>) {
    	# $saut = 0 if $line =~ /^id:name:IO_group_id:/;  # plus nécessaire, fait dans la première boucle
    	# next if $saut;                                  # plus nécessaire non plus
            next if $line =~ /^\s*$/;                         # saute d'éventuelles lignes vides
    	my ($name, $capacity) =  (split /:/, $line)[1, 7];
     
    	if ($capacity =~ /^(\d+\.\d+)(\w+)$/) {
    		my $number = $1;
    		my $type = $2;
            # ...
    A la fin, le hachage de hachages %header_values contient les valeurs qui t'intéressent dans les lignes d'entêtes, rangées par ID. Tu en fais ce que tu veux.

  5. #5
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Merci je vais essayer et regarder tout ça !
    Les données je veux juste simplement les afficher dans un fichier Excel et je fais mes calculs dedans

  6. #6
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Salut Lolo!

    Je reviens après pas mal de temps car j'ai encore eu des projets hyper importants.
    Désolé !

    J'ai testé ton code et ça fonctionne (J'ai print le Dumper pour voir).

    Mon soucis c'est, plutôt comment l'utiliser maintenant ?
    Mon but final serait de l'input dans un fichier Excel qui ressemble à ça :

    name capacity free_capacity
    DRIVENAME 0 TB 0 TB


    Comment faire ?

    Au début je pensais en utilisant l'ID mais vu que je traîte plusieurs fichiers, mon output à des ID doublons.
    Exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    '2' => {
                       'name' => 'NBB2_DMZ_STW24',
                       'capacity' => '75.27TB',
                       'free_capacity' => '60.41TB'
                     },
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     '2' => {
                       'name' => 'NBB4_DMZ_STW44',
                       'capacity' => '75.27TB',
                       'free_capacity' => '59.77TB'
                     },
    Merci!

  7. #7
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Original1992 Voir le message
    Au début je pensais en utilisant l'ID mais vu que je traîte plusieurs fichiers, mon output à des ID doublons.
    Exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    '2' => {
                       'name' => 'NBB2_DMZ_STW24',
                       'capacity' => '75.27TB',
                       'free_capacity' => '60.41TB'
                     },
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     '2' => {
                       'name' => 'NBB4_DMZ_STW44',
                       'capacity' => '75.27TB',
                       'free_capacity' => '59.77TB'
                     },
    Je ne comprends pas. Un hachage ne peut pas avoir plusieurs enregistrements avec la même clef. Donc il ne peut y avoir de doublons dans le hachage proprement dit. Ils sont à quel niveau, tes doublons?

    Une solution serait peut-être, pour les clefs de ton hachage, d'utiliser non pas seulement l'ID, mais une clef composite concaténant l'ID et un identifiant du fichier dont il vient, quelque chose du genre "2-fic1". Mais je ne sais pas si cela correspond à ton besoin ultérieur.

    Sinon, il faut éventuellement penser à une structure de données un peu plus complexe, par exemple un hachage de tableaux (ou hash of arrays, HoA) dans laquelle chaque élément du hachage est un tableau de valeurs. Par exemple en modifiant la boucle while comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        my ($id, $name, $capacity, $free) = (split /:/, $line)[0, 1, 5, 7];
        push @{$header_value{$id}}, { name => $name, capacity => $capacity, free_capacity => $free};
    mais je ne suis pas du tout sûr que cela réponde à ton besoin qui est un peu nébuleux pour moi.

  8. #8
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Je me suis mal exprimé alors je pense...

    Comment puis-je traiter les informations ?
    Comment les écrires dans un fichier Excel et les manipuler à ma guise par exemple?

    Comment transformer

    '2' => {
    'name' => 'NBB2_DMZ_STW24',
    'capacity' => '75.27TB',
    'free_capacity' => '60.41TB'
    },

    en :

    Name Capacity Free Capacity
    NBB2_DMZ_STW24 75.27 60.41

    etc ?

    Merci !

  9. #9
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Je me permet une petite relance

    Merci !

  10. #10
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Tu peux créer un fichier .csv qu'excel ouvrira sans pb , ou utiliser le module Excel pour générer directement un fichier adéquat

  11. #11
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Citation Envoyé par olivier1969 Voir le message
    Tu peux créer un fichier .csv qu'excel ouvrira sans pb , ou utiliser le module Excel pour générer directement un fichier adéquat
    En fait, je sais comment créer un fichier Excel et insérer des données dans les cellules.

    Ici, mon problème, c'est plutôt de savoir comment faire pour justement récupérer ces données ?
    En plus simple, dans l'exemple que j'ai montré, comment par exemple afficher 'NBB2_DMZ_STW24' ?

  12. #12
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Autre question bête , n'est ce pas plus simple d'importer directement tes données dans une feuille excel et les traiter directement ? voir mon fichier joint , tu n'as plus qu'a supprimer les colonnes inutiles ....
    Fichiers attachés Fichiers attachés

  13. #13
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Citation Envoyé par olivier1969 Voir le message
    Autre question bête , n'est ce pas plus simple d'importer directement tes données dans une feuille excel et les traiter directement ? voir mon fichier joint , tu n'as plus qu'a supprimer les colonnes inutiles ....
    Pas vraiment. A la base le script regroupe un bon nombres d'informations condensé et traité via le script pour s'y retrouver et arriver à un résultat lisible sans intervention humaine.
    Ici, je veux juste terminer ce script, et la dernière partie demande simplement d'insérer ces dernières informations ("triés" aussi) dans mon Excel.

    Je sais comment traiter un Excel et insérer une données via Perl. Ici mon problème c'est que je ne sais pas récupérer les informations.

  14. #14
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Alors, montre-nous un Data::Dumper de tes données, on pourra t'expliquer comment y accéder.

  15. #15
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Alors, montre-nous un Data::Dumper de tes données, on pourra t'expliquer comment y accéder.
    Hello Lolo,

    Je joint un fichier du contenu de Data::Dumper ci-dessous.

    Merci

    Data.txt

  16. #16
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    d'après la tête de ton dump, il y a des problèmes dans ton programme.

    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
    $VAR1 = {
              '6' => {
                       'free_capacity' => '82.32TB',
                       'capacity' => '193.92TB',
                       'name' => 'NBB2_CORP_STW23'
                     },
              'RC = 0' => {
                             'name' => undef,
                             'free_capacity' => undef,
                             'capacity' => undef
                           },
              '-----------------------------------------------' => {
                                                                      'capacity' => undef,
                                                                      'free_capacity' => undef,
                                                                      'name' => undef
                                                                    },
              '4' => {
                       'capacity' => '36.33TB',
                       'free_capacity' => '19.83TB',
                       'name' => 'NBB2_CORP_NRLSAS_STW22'
                     },
              'Command to execute ' => {
                                         'name' => ' svcinfo lsvdisk -delim ',
                                         'free_capacity' => undef,
                                         'capacity' => undef
                                       },
              '--------------------------------------------------' => {
                                                                         'capacity' => undef,
                                                                         'free_capacity' => undef,
                                                                         'name' => undef
                                                                       },
              '1' => {
                       'free_capacity' => '0',
                       'capacity' => '0',
                       'name' => 'MigrationPool_8192'
                     },
    		# ...

    Je ne pense pas que les chaînes de caractères suivantes soient des clefs légitimes de ton hash:
    - 'RC = 0'
    - '-----------------------------------------------'
    - 'Command to execute '

    Je pense qu'il faudrait que tu testes tes lignes en entrée et vérifies qu'elles contiennent ce que tu attends avant de stocker tes données dans la structure de données. Typiquement des lignes ne contenant que des tirets doivent certainement être exclues.

    Je te proposerai plus tard un bout de code pour relire ta structure de données afin d'alimenter le fichier Excel.

  17. #17
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Voici un exemple d'accès à une structure de donnée comme la tienne (mais nettoyée des valeurs bizarroïdes mentionnées dans mon précédent post).
    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
     
    use strict;
    use warnings;
    use feature 'say';
     
    my $data = {
              '6' => {
                       'free_capacity' => '82.32TB',
                       'capacity' => '193.92TB',
                       'name' => 'NBB2_CORP_STW23'
                     },
     
              '4' => {
                       'capacity' => '36.33TB',
                       'free_capacity' => '19.83TB',
                       'name' => 'NBB2_CORP_NRLSAS_STW22'
                     },
              '1' => {
                       'free_capacity' => '0',
                       'capacity' => '0',
                       'name' => 'MigrationPool_8192'
                     },
    		};
     
    for my $key (keys %$data) {
    	say "Item NR: $key";
    	say "\tName: $data->{$key}{name}";
    	say "\tCapacity: $data->{$key}{capacity}";
    	say "\tFree capacity: $data->{$key}{free_capacity}";
    }
    Ce qui affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     $ perl  test.pl
    Item NR: 6
            Name: NBB2_CORP_STW23
            Capacity: 193.92TB
            Free capacity: 82.32TB
    Item NR: 1
            Name: MigrationPool_8192
            Capacity: 0
            Free capacity: 0
    Item NR: 4
            Name: NBB2_CORP_NRLSAS_STW22
            Capacity: 36.33TB
            Free capacity: 19.83TB
    Cela te convient?

  18. #18
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bonjour,

    d'après la tête de ton dump, il y a des problèmes dans ton programme.

    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
    $VAR1 = {
              '6' => {
                       'free_capacity' => '82.32TB',
                       'capacity' => '193.92TB',
                       'name' => 'NBB2_CORP_STW23'
                     },
              'RC = 0' => {
                             'name' => undef,
                             'free_capacity' => undef,
                             'capacity' => undef
                           },
              '-----------------------------------------------' => {
                                                                      'capacity' => undef,
                                                                      'free_capacity' => undef,
                                                                      'name' => undef
                                                                    },
              '4' => {
                       'capacity' => '36.33TB',
                       'free_capacity' => '19.83TB',
                       'name' => 'NBB2_CORP_NRLSAS_STW22'
                     },
              'Command to execute ' => {
                                         'name' => ' svcinfo lsvdisk -delim ',
                                         'free_capacity' => undef,
                                         'capacity' => undef
                                       },
              '--------------------------------------------------' => {
                                                                         'capacity' => undef,
                                                                         'free_capacity' => undef,
                                                                         'name' => undef
                                                                       },
              '1' => {
                       'free_capacity' => '0',
                       'capacity' => '0',
                       'name' => 'MigrationPool_8192'
                     },
    		# ...

    Je ne pense pas que les chaînes de caractères suivantes soient des clefs légitimes de ton hash:
    - 'RC = 0'
    - '-----------------------------------------------'
    - 'Command to execute '

    Je pense qu'il faudrait que tu testes tes lignes en entrée et vérifies qu'elles contiennent ce que tu attends avant de stocker tes données dans la structure de données. Typiquement des lignes ne contenant que des tirets doivent certainement être exclues.

    Je te proposerai plus tard un bout de code pour relire ta structure de données afin d'alimenter le fichier Excel.
    Hello,

    Effectivement certaines entrées dans le fichier dump ne sont pas nécessaires.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'name' => undef,
                             'free_capacity' => undef,
                             'capacity' => undef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     'Command to execute ' => {
                                         'name' => ' svcinfo lsvdisk -delim ',
                                         'free_capacity' => undef,
                                         'capacity' => undef
                                       },
              '--------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     '1' => {
                       'free_capacity' => '0',
                       'capacity' => '0',
                       'name' => 'MigrationPool_8192'
                     },
    Ce genre de données ne me sont pas nécessaire.
    Je vais essayer de voir comment je peux les exclure ...

  19. #19
    Membre habitué
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 203
    Points : 164
    Points
    164
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Voici un exemple d'accès à une structure de donnée comme la tienne (mais nettoyée des valeurs bizarroïdes mentionnées dans mon précédent post).
    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
     
    use strict;
    use warnings;
    use feature 'say';
     
    my $data = {
              '6' => {
                       'free_capacity' => '82.32TB',
                       'capacity' => '193.92TB',
                       'name' => 'NBB2_CORP_STW23'
                     },
     
              '4' => {
                       'capacity' => '36.33TB',
                       'free_capacity' => '19.83TB',
                       'name' => 'NBB2_CORP_NRLSAS_STW22'
                     },
              '1' => {
                       'free_capacity' => '0',
                       'capacity' => '0',
                       'name' => 'MigrationPool_8192'
                     },
    		};
     
    for my $key (keys %$data) {
    	say "Item NR: $key";
    	say "\tName: $data->{$key}{name}";
    	say "\tCapacity: $data->{$key}{capacity}";
    	say "\tFree capacity: $data->{$key}{free_capacity}";
    }
    Ce qui affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     $ perl  test.pl
    Item NR: 6
            Name: NBB2_CORP_STW23
            Capacity: 193.92TB
            Free capacity: 82.32TB
    Item NR: 1
            Name: MigrationPool_8192
            Capacity: 0
            Free capacity: 0
    Item NR: 4
            Name: NBB2_CORP_NRLSAS_STW22
            Capacity: 36.33TB
            Free capacity: 19.83TB
    Cela te convient?
    Comme tu le présente ça semble ce que je recherche.
    Avec des petites adaptations de mon côté évidemment. Je vais voir si il n'est pas trop compliqué d'utilisé cette méthode pour l'insérer dans un fichier Excel.

    Je vais voir si je m'en sors avec cette manière et je reviens si pas

    EDIT : J'ai fais un petit test rapide, mais ça ne fonctionne pas directement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my %header_value;
    while (my $line = <$FH>) {	# première boucle pour lire le premier groupe de lignes
    	last if $line =~ /^id:name:IO_group_id:/;	# sort de cette boucle et passe à la suivante pour la suite des données
    	next if $line =~/id:name:status:mdisk_count:/;  	# saute la ligne d'entête
    	next if $line =~ /^\s*$/;  	# saute d'éventuelles lignes vides
    	my ($id, $name, $capacity, $free) = (split /:/, $line)[0, 1, 5, 7];
    	$header_value{$id} = { name => $name, capacity => $capacity, free_capacity => $free};	# stockage des valeurs qui t'intéressent dans un hash
    }	
     
    for my $key (keys %header_value) {
    	say "\tName: $header_value->{$key}{name}";
    	};
    J'ai comme erreur Global symbol "$header_value" requires explicit package name (did you forget to declare "my $header_value"?) at Script_SVC_Test_Excel_OK.pl line 35Je ne comprends pas trop, où je peux déclarer ça ? Il l'est déjà non?

  20. #20
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    d'après ton dump, je croyais que tu utilisais une référence vers un hachage, alors qu'en fait tu utilises directement un hachage (c'est sans doute à l'impression du hachage que tu transformes la structure de données en référence au hachage, ce qui est d'ailleurs une bonne façon d'utiliser Dumper).

    Du coup, l'ai modifié le bout de code de mon exemple pour refléter ta vraie structure de données:
    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
     
    use strict;
    use warnings;
    use feature 'say';
     
    my %data = (
              '6' => {
                       'free_capacity' => '82.32TB',
                       'capacity' => '193.92TB',
                       'name' => 'NBB2_CORP_STW23'
                     },
     
              '4' => {
                       'capacity' => '36.33TB',
                       'free_capacity' => '19.83TB',
                       'name' => 'NBB2_CORP_NRLSAS_STW22'
                     },
              '1' => {
                       'free_capacity' => '0',
                       'capacity' => '0',
                       'name' => 'MigrationPool_8192'
                     },
    		);
     
    for my $key (keys %data) {
    	say "Item NR: $key";
    	say "\tName: $data{$key}{name}";
    	say "\tCapacity: $data{$key}{capacity}";
    	say "\tFree capacity: $data{$key}{free_capacity}";
    }
    Ceci me donne le même affichage que sur mon post précédent.

    Là, ça devrait fonctionner avec tes données. Dans ton code, modifie la boucle finale comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for my $key (keys %header_value) {
    	say "\tName: $header_value{$key}{name}";
    	};
    et vois si ça te donne ce que tu veux.

Discussions similaires

  1. Aide sur un code de collecte de donnée sur plusieurs documents
    Par ahzouari dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/01/2011, 08h26
  2. Réponses: 22
    Dernier message: 02/02/2009, 20h36
  3. [MySQL] Conseil sur traitement des données
    Par Feng-Huang dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 07/01/2009, 12h16
  4. Aide de demarrage sur un script perso
    Par 74manu74 dans le forum Shell et commandes GNU
    Réponses: 24
    Dernier message: 22/11/2008, 23h27
  5. Demande d'aide sur la liaison avec base de données mysql
    Par almora007 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/08/2007, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo