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

  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 [QUESTION] L'utilisation de Perl pour mon "projet"

    Bonjour à tous,

    J'espère ne pas m'être trompé de sous-forum pour ce message, mais je n'ai pas trouvé de "Général".

    Alors voilà, je viens vers vous car j'aimerai savoir si Perl pemettrai de réaliser ce que j'aimerai faire.
    Me dites-vous, pourquoi vous demander ceci si je sais le faire avec un autre langage type Powershell ou autre ? Car un ancien collègue à réaliser quasi tout nos scripts, etc. en Perl, et que je ne maîtrise pas Perl. Je me dis, si Perl permet de faire ce que je recherche, autant l'apprendre en même temps.

    Donc voilà, sur un système de stockage, je reçois un output qui ressemble à ceci (voir attachement).

    Mon but est le suivant :

    Regrouper les "header" et les données ensemble (comme par exemple un genre de Text To Columns d'Excel).
    Et ensuite effectuer des opérations comme ceci (à titre d'exemple) :

    Name Capacity
    SQL01 1.00GB
    ORA01 2.00GB
    SQL02 3.00GB
    Test01 10.00GB

    etc

    Et ensuite avoir un output du genre comme résultat final :

    SQL : 4.00GB
    ORACLE : 2.00GB
    Other : 10.00GB

    Pensez-vous que Perl peut faire ceci ? Sans obtenir un script extrêmement compliqué ?

    Merci d'avance !

    Bien à vous,
    Original
    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 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    je ne vois pas de pièce jointe et ne peux donc voir les données en entrée.

    Mais le type de manipulation de données que tu décris est très simple à faire en Perl, et je dirais même que c'est l'un des points forts de Perl et que Perl est sans conteste possible l'un des meilleurs langages pour cela.

    Donc oui, possible, sans doute en quelques lignes de code seulement.

    Mais présente un échantillon de tes données en entrée. Impossible de t'aider sans voir ces données.

  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,

    Merci pour ta réponse.
    Zut j'étais persuadé de l'avoir upload ... J'ai du bug quelque part.

    Voilà, tu le trouveras ci-joint maintenant
    C'est un vrai échantillon de ce que je reçois, dans le fichier, par exemple, je dois ignorer les 11 premières lignes, et commencer à traiter à partir de la 12. Mais je suppose que Perl permet de commencer uniquement à partir d'une certaine ligne ou en passer un certains nombre ...

    J'espère que c'est clair pour toi dérsomais.

    A bientôt,
    Original
    Fichiers attachés Fichiers attachés

  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 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    je ne vois pas du tout comment exploiter les données de ton fichier pour ce que tu dis vouloir faire (dans ta première étape). Je ne trouve même pas des chaînes de caractères comme SQL ou ORA. Je crains que je n'ai besoin d'informations plus précises sur ce que tu récupères dans ton fichier en entrée.

  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

    Bonjour,

    Comme tu peux le voir c'est des données avec comme delimiter le double point (

    Dans le fichier, je n'ai besoin que de traiter les "colonnes" "Name" et "Capacity".

    Pour te donner un exemple :

    A l'ID 2 par exemple, le "Name"=V_SVCC_NBB2_VMWare_Prd_0525_04A1_MA
    A l'ID 2 par exemple, la "Capacity"=1.22TB

    Mon but est le suivant :
    Quand le programme voit que dans le "Name" on retrouve "VMWare" il récupère Capacity est l'aditionne à un total qui affichera par exemple :

    VMWare = 1.22TB

    Si le programme retrouve un autre VMWare, il l'aditionne au 1.22TB déjà présent.

    C'est plus clair pour toi ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    voici un exemple de code

    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
    use strict;
    use warnings;
     
    my $total_cap = 0;
    <DATA> for 1..11;
    while (my $line = <DATA>) {
    	my ($name, $capacity) =  (split /:/, $line)[1, 7];
    	if ($name =~ /VMWare/) {
    		$capacity = $1 if $capacity =~ /^([\d.]+)/;
    		$total_cap += $capacity;
    	}
    }
    print "Total Capacity = ", $tot_cap, "\n";
     
    __DATA__
    Command to execute : svcinfo lsmdiskgrp -delim : :
    --------------------------------------------------
    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:297:124.98TB:1024:7.54TB:117.44TB:117.43TB:117.43TB:93: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::
     
     
    RC = 0
     
    Command to execute : svcinfo lsvdisk -delim : :
    -----------------------------------------------
    id:name:IO_group_id:IO_group_name:status:mdisk_grp_id:mdisk_grp_name:capacity:type:FC_id:FC_name:RC_id:RC_name:vdisk_UID:fc_map_count:copy_count:fast_write_state:se_copy_count:RC_change:compressed_copy_count:parent_mdisk_grp_id:parent_mdisk_grp_name:formatting:encrypt:volume_id:volume_name:function
    0:V_SVCC_NBB2_SCNAMM21_22_PROA1M_OR01_0398_NM:1:IO_GRP1:online:0:NBB2_CORP_DS8K8:75.00GB:striped:::::600507680181865A7800000000000398:0:1:not_empty:0:no:0:0:NBB2_CORP_DS8K8:no:no:0:V_SVCC_NBB2_SCNAMM21_22_PROA1M_OR01_0398_NM:
    1:V_SVCC_NBB2_SWPNCNDATP01_G_0001_AU:1:IO_GRP1:online:4:NBB2_CORP_NRLSAS_STW22:2.00TB:striped:::1:rcrel0:600507680181865A7800000000000399:0:1:empty:0:no:0:4:NBB2_CORP_NRLSAS_STW22:no:no:1:V_SVCC_NBB2_SWPNCNDATP01_G_0001_AU:aux
    2:V_SVCC_NBB2_VMWare_Prd_0525_04A1_MA:0:IO_GRP0:online:2:NBB2_CORP_STW22:1.22TB:striped:::2:rcrel5:600507680181865A7800000000000525:0:1:not_empty:0:no:0:2:NBB2_CORP_STW22:no:no:2:V_SVCC_NBB2_VMWare_Prd_0525_04A1_MA:master
    3:V_SVCC_NBB2_SCNDEV31_32_DEVNFS_039C_NM:1:IO_GRP1:online:2:NBB2_CORP_STW22:5.00GB:striped:::::600507680181865A780000000000039C:0:1:not_empty:0:no:0:2:NBB2_CORP_STW22:no:no:3:V_SVCC_NBB2_SCNDEV31_32_DEVNFS_039C_NM:
    Ici, j'ai mis les données à la fin du programme pour faciliter le test. Dans le cas réel, il faudrait ouvrir le fichier et lire le fichier, au lieu de lire la section DATA.

  7. #7
    Membre émérite Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    1 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 1 366
    Points : 2 614
    Points
    2 614

    Par défaut

    Ce qui reste à déterminer, c'est par quelle magie on passe de:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    V_SVCC_NBB2_SCNAMM21_22_PROA1M_OR01_0398_NM
    V_SVCC_NBB2_SWPNCNDATP01_G_0001_AU
    V_SVCC_NBB2_VMWare_Prd_0525_04A1_MA
    V_SVCC_NBB2_SCNDEV31_32_DEVNFS_039C_NM

    à quelque chose comme:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL01
    ORA0
    SQL02
    Test01
    (quelle partie de la colonne name doit-on extraire? Le format est-il toujours le même?:x_xxx_xxx_nom_.....)

    puis à:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQL
    ORACLE
    Other
    (Là il te faudrait un hash avec pour clefs une partie des noms de l'étape précédente associée à un des noms lisibles: SQL, ORACLE, Other...)



    Deux autres choses:
    • D'après le fichier que tu as fournis, la capacité des disques n'est pas toujours exprimée en TB mais aussi en GB, tu devras donc faire des conversions avant d'additionner.
    • Est-ce que le csv qui t'intéresse commence toujours à la ligne 12 ou bien tu dois d'abord trouver la ligne adéquate en fonction de la commande?
    3615 JEXISTE

  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

    Hello CosmoKnacki,

    Alors, la première citation est le contenu du fichier.
    La deuxième était juste un bête exemple sans le fichier ... Peut-être pas le plus correcte, c'est sur.
    Le 3eme était en fait un genre de résultat voulue. Selon un élément présent dans "Name", cela s'ajoute dans un "Total".

    Donc par exemple si on retrouve "VMware" dans Name, cela ajoute la "Capacity" à "Total VMware".

    Effectivement il faudra tout convertir vers du TB.
    Ca commence toujours à la même ligne.

    Merci pour ton premier eemple de code Lolo! Je suis peut-être en train de faire une débilité (je suis entrain de lire les cours Perl sur le site pour apprendre tout de même en même temps que votres aides) mais lorsque j'exécute ton code, j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lobal symbol "$tot_cap" requires explicit package name (did you forget to declare "my $tot_cap"?) at Test.pl line 13.
    Execution of Test.pl aborted due to compilation errors.
    Edit : Ok désolé j'avais mal lu le code ! C'est "my $total_cap" qui faut indiquer
    Pour mon information d'inculte. J'ai ajouté la ligne suivante pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    4:V_SVCC_NBB2_SLV_VMWARE_NAMMO_03F6_0479_AU:0:IO_GRP0:online:2:NBB2_CORP_STW22:2.00TB:striped:::253:rcrel414:600507680181865A7800000000000479:0:1:not_empty:0:no:1:2:NBB2_CORP_STW22:no:no:253:V_SVCC_NBB2_SLV_VMWARE_NAMMO_03F6_0479_AU:aux
    A la suite des DATA. Mais le Total ne change pas car c'est "VMWARE" et non "VMWare". Pour ce genre de cas :

    Dois-je indiquer plusieurs paramètres (Car de toute manière, une "VMware" ne se reconnait pas forcément par "VMware" et ceux, même si on ne parle pas de Case.
    Edit : OK j'ai trouvé un moyen, peut-être pas le meilleur mais on dirait que ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($name =~ /VMWare/ || $name =~ /VMWARE/)


    Est-il possible de devenir une variable sans prendre compte justement de cette Case qui réduirai les paramètres ?

    Merci !

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    Pour ignorer la casse dans la reconnaissance, il suffit d'ajouter le modificateur i (= ignore case) à l'expression régulière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($name =~ /VMWare/i) { # ...

  10. #10
    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

    Désolé j'ai cliqué sur Résolu sans faire exprès !
    Dernière petite question d'analyse :

    Dois-je d'abord apprendre à me concentrer comment lire et traiter un fichier ?
    Ou alors je peux continuer avec les data en brut et cela ne changera rien ?

    Également, Lolo, penses-tu que tu pourrais mettre en un français banal de ce que fais chaque ligne ? Ou du moins les plus complexe, car je ne comprends pas tout ! Si ce n'est évidemment pas trop demandé.

    Edit :
    Petit ajout de question, est-il possible de remplacer VMWare par exemple par une recherche du style *VM* ? Merci !

    Merci !

  11. #11
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Original1992 Voir le message
    Petit ajout de question, est-il possible de remplacer VMWare par exemple par une recherche du style *VM* ? Merci !

    Merci !
    Il suffit sans doute d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($name =~ /VM/) {
    Cela renverra vrai si le nom contient les lettres VM dans cet ordre et en lettres capitales. Il faut cependant faire un peu attention: plus l'expression régulière est courte, plus tu risques d'obtenir un faux positif. Avec les lettres VM en capitales, le risque doit être assez faible, mais il n'est peut-être mas nul. Mais toi seul, ici, connais tes données, c'est toi qui peux prendre la décision.

    Pour tes autres demandes, je repasserai un peu plus tard et posterai du code commenté.

  12. #12
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    voici le code avec des explications complémentaires:

    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
     
    use strict;     # instruction dont le but est demander à Perl de vérifier la syntaxe plus strictement 
                    # (permet de gagner du temps de débogage)
    use warnings;   # également une instruction de compilation permettant à Perl de t'avertir d'erreurs probables dans le code
     
    my $total_cap = 0;     # my sert à déclarer une variable lexicale
    <DATA> for 1..11;      # Lire les 11 premières lignes du fichier en entrée (ici la section DATA à la fin)
    while (my $line = <DATA>) {       # lecture des lignes suivantes, une à une
        my ($name, $capacity) =  (split /:/, $line)[1, 7];  # pour chaque ligne, la splitter sur le caractère ":",
                                                            # récupérer les champs 1 à 7 (le premier champ est numéroté à zéro)
                                                            # et les stocker dans les variables $name et $capacity
        if ($name =~ /VMWare/) {                            # si la variable $name contient le "motif" /VMWare/ (c'est une expression régulière)
            $capacity = $1 if $capacity =~ /^([\d.]+)/;     # alors récupérer les chiffres qui suivent. [\d.]+ reconnaît des chiffres 
                                                            # ou des points et $1 récupère ce qui a été reconnu entre parenthèses
            $total_cap += $capacity;                        # ajouter la capacité récupérée à la variable $total_cap
        }
    }
    print "Total Capacity = ", $total_cap, "\n";

  13. #13
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Original1992 Voir le message
    Dois-je d'abord apprendre à me concentrer comment lire et traiter un fichier ?
    Ou alors je peux continuer avec les data en brut et cela ne changera rien ?
    Tu peux continuer avec DATA pour l'instant, l'essentiel du code ne changera pas, mais tu peux aussi utiliser un fichier externe.

    Pour lire et traiter un fichier externe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $fichier = "fichier.txt";   # mets ici le vrai nom de ton fichier
    open my $FH, "<", $fichier or die "Ouverture impossible de $fichier $!";
    <$FH> for 1..11;  # lecture des onze premières lignes
    while (my $line = <$FH>) {     # le reste ne change pas
    La première ligne déclare une variable contenant le nom du fichier à ouvrir.

    La seconde ouvre le fichier en lecture ("<") et y associe le filehandle $FH. La fin de l'instruction avorte le programme s'il n'a pas réussi à ouvrir le fichier (inutile de continuer dans ce cas) et donne des indications sur la raison de l'échec (la variable $! contient la raison, par exemple fichier non trouvé, répertoire inexistant, etc.).

    La troisième lit les onze premières lignes du file handle $FH.

    La quatrième lit les autres lignes une à une.

    PS: tu as le droit de "plusser" (la petite icône en dessous du message sur le droite) mes réponses si elles te sont utiles.

  14. #14
    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

    Hello

    Merci pour toutes vos interventions.
    Cela fait déjà quelques messages que le sujet à un peu débordé (et c'est ma faute, je sais).

    Ma question est la suivante : Puis-je continuer à poser mes questions et intérrogations à la suite comme actuellement, ou dois-je ouvrir un nouveau sujet ?

    @Lolo, suite à tes différents conseils/codes et l'aide d'un amis qui travail pas mal en Perl (mais difficile à obtenir 10 minutes) je suis arrivé à quelque chose (toujours très basique et loin du résultat voulu) de sympas (le code ne ressemble plus exactement à celui que tu m'as fournis, mon ami l'a un peu modifié à sa sauce).
    Mais si cela ne te dérange pas, je ne serai pas contre quelques conseils/aide encore de ta part !

    En attendant d'avoir votre réponse concernant la possibilité d'ouvrir un nouveau sujet, voici ce que j'aimerai faire et où j'en suis :

    - Pour le moment je lis le fichier et je récupère la capacité si je trouve les caractères "VMWARE" (sans la case)
    - Je convertis les GB en TB

    Maintenant j'aimerai arriver à cette étape :
    - Pouvoir récupérer et séparer deux "totals". Exemple :
    Total Capacité VMware : 10 TB
    Total Capacité SQL : 10 TB

    Comment faire ?

    Voilà le code auxquel je suis arrivé actuellement :
    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
    use strict;
    use warnings;
     
    my $total_cap = 0.0;
    my $fichier = "SVTEST.txt";
    open my $FH, "<", $fichier or die "Ouverture impossible du fichier $fichier";
    <$FH> for 1..11;
     
    while (my $line = <$FH>) {
    	my ($name, $capacity) =  (split /:/, $line)[1, 7];
    	if ($name =~ m{\A .+ VMware}xmsi) 
    	{
    		my ($number,$type) = ($capacity =~	m{\A \s* ([\d.]+) \s* 
    											 ([A-Z]+) \s* \z}xms);
    		next if !defined $number;
    		print "$number $type \n"; #Pour test
    		$number = $number / 1000.0 if $type eq 'GB'; #Convertis en TB si le type est GB
    		$total_cap += $number;
    	}
    }
    print "Total Capacity = ", $total_cap, " TB", "\n";

  15. #15
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    Bonsoir,

    comme c'est le même sujet, ça me paraît OK de continuer sur le même fil.

    Peux-tu expliquer comment on distingue les deux sortes de capacités? Est-ce que, par exemple, c'est juste soit VMware, soit SQL? Ou y a-t-il une autre forme de distinction?

  16. #16
    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

    C'est juste soit dans VMware, soit dans SQL. En tout cas pour le moment je n'ai que ce scénario.

  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 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    OK, dans ce cas, quelque chose comme ceci:
    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
     
    my ($total_vm, $total_sql) = (0, 0);
    my $fichier = "SVTEST.txt";
    open my $FH, "<", $fichier or die "Ouverture impossible du fichier $fichier $!";
    <$FH> for 1..11;
    while (my $line = <$FH>) {
    	my ($name, $capacity) =  (split /:/, $line)[1, 7];
    	my ($number,$type) = ($capacity =~ m{\A \s* ([\d.]+) \s* ([A-Z]+) \s* \z}xms);
    	next unless defined $number;
    	# print "$number $type \n"; #Pour test
    	$number = $number / 1000.0 if $type eq 'GB'; #Convertis en TB si le type est GB
    	if ($name =~ /VMware/xmsi) {
    		$total_vm += $number;
    	} else {
    		$total_sql $= $number;
    	}
    }
    print ...

  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

    Bonsoir,

    Désolé, j'ai mal lu ou compris la question et j'ai répondu comme un débile.
    Ca ne sera pas bêtement soit du SQL, soit du VMware. En fait, selon plusieurs paramètres, il doit mettre des capacités dans un autre total.

    A mon avis il faut utiliser un tableau.

    En fait, ça devrait ressembler à ceci :

    - Je vois "Vmware" J'ajoute dans "Capacité_Vmware"
    - Je vois "sql" j'ajoute dans "Capacité_sql"
    - Je vois "Oracle" j'ajoute dans "Capacité_Oracle
    - Je vois "SRV" j'ajoute dans "Capacité_Vmware"

    Donc en gros il y a plusieurs totaux possible et plusieurs paramètres peuvent et doivent être pris en compte. Exemple comme ci-dessus : "Vmvware" et "SRV" iront dans le total "Vmware".

    J'espère que c'est compréhensible et désolé de la mauvaise réponse !
    Mais si c'était qu'un simple ELSE, je n'aurai pas osé vous demander !

  19. #19
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 559
    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 559
    Points : 12 223
    Points
    12 223
    Billets dans le blog
    1

    Par défaut

    Bonsoir,

    si ça reste trois ou quatre choix, une série de elsifpourrait suffire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	if ($name =~ /VMware/xmsi or $name =~ /SRV/) {
    		$total_vm += $number;
    	} elsif ($name =~ /Oracle/ {
    		$total_oracle += $number;
    	} else {
    		$total_sql += $number;
    	}
    (Ce qui implique bien sûr de déclarer $total_oracle avant le while (en fait, en début de programme, avec $total_vm et $total_sql).

    Mais si c'est plus compliqué ou risque de le devenir, alors il faut plutôt utiliser un hachage de compteurs.

    On le déclare avec quelque chose du genre:
    Après, on peut simplement modifier le code ci-dessus comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	if ($name =~ /VMware/xmsi or $name =~ /SRV/) {
    		$count{vm} += $number;
    	} elsif ($name =~ /Oracle/ {
    		$count{oracle} += $number;
    	} else {
    		$count{sql} += $number;
    	}
    Cela peut sembler ne pas apporter grand chose, mais c'est mieux, surtout si le nombre de catégories de capacités est susceptible d'évoluer: une seule déclaration de hachage au début et simplification notable à l'impression des résultats finaux qui peut se faire avec une boucle d'une seule ligne sur les clefs-valeurs du hachage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "Capacity for $_ = $count{$_} TB\n" for keys %count;
    Selon les circonstances, il est peut-être même possible de se débarrasser de la série de if ... elsif ... else, mais là, il faudrait des informations nettement plus détaillées sur le format de tes données en entrée pour s'en assurer.

    Cela dit, je suis tout-à-fait prêt à t'aider, mais il faut vraiment que tu commences à te débrouiller par tes propres moyens. Je te conseille vivement de prendre connaissance d'un des tutoriels présents sur ce site pour vraiment apprendre le langage; je pense en particulier à celui de mon ami Sylvain: http://lhullier.developpez.com/tutoriels/perl/intro/, qui est à mon humble avis très bon.

    Perso, j'ai commencé Perl avec un tuto d'une taille à peu près équivalente, 70 pages me semble-t-il (c'était en anglais et c'est aujourd'hui dépassé, donc je ne te conseille pas celui que j'ai utilisé à l'époque); après avoir passé un weekend à lire ce tuto et tester des bouts de code, j'étais capable d'écrire un programme à usage professionnel assez nettement plus compliqué que ce que tu as à faire (bon, le code que j'ai écrit à l'époque me paraîtrait sans doute plutôt, voire très, mauvais aujourd'hui, mais il fonctionnait, c'est l'essentiel quand on débute). Et c'est en faisant soi-même qu'on apprend le mieux, même si obtenir des conseils de personnes plus chevronnées permet d'éviter des pièges classiques et peut faire gagner du temps.

  20. #20
    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

    Hello

    Oui j'ai téléchargé des livres justement, je vais essayer de les lires dés que j'ai des moments de libre !
    Ainsi que le tutorial que tu me proposes

    Petite question, je reçois ceci comme erreur :
    Use of uninitialized value $number in addition (+) at C:\LocalData\Scripts\Test_Multi.pl line 13, <$FH> line 15.
    Use of uninitialized value $number in addition (+) at C:\LocalData\Scripts\Test_Multi.pl line 13, <$FH> line 17.
    Use of uninitialized value $number in addition (+) at C:\LocalData\Scripts\Test_Multi.pl line 15, <$FH> line 18.
    Use of uninitialized value $number in addition (+) at C:\LocalData\Scripts\Test_Multi.pl line 13, <$FH> line 19.
    Capacity for sql = 0 TB
    Capacity for vm = 0 TB

    Mais j'avoue je ne comprends pas ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Quelle est l'utilité de Perl pour mon projet ?
    Par cj_prog dans le forum Langage
    Réponses: 1
    Dernier message: 04/05/2011, 15h41
  2. Erreur à l'utilisation de PERL pour Solaris (perl: warning: Setting locale failed.)
    Par arnaudperfect dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 13/10/2010, 18h08
  3. [Tableaux] Comment utiliser un tableau pour mon application
    Par pierrot10 dans le forum Fonctions
    Réponses: 6
    Dernier message: 26/01/2008, 11h37

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