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

Langage Perl Discussion :

Extraction des données dans un fichier texte brut


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Extraction des données dans un fichier texte brut
    Bonjour,
    J'ai un fichier brut qui contient des données que je dois prendre et mettre en forme (Préparation pour insertion dans BD MySQL).
    L'inconvénient:
    1 - c'est qu'il y a plusieurs lignes avec la même valeur que je souhaite (doublons).
    2 - tous les champs ne sont pas toujours présents (ex:"text1 ou text2")
    3 - je souhaite récupérer des valeurs dans deux lignes toutes les deux commencent par le même mot
    (ex: ctp "LOMM5-ES003/r01s1b11p01" payloadPos "02"
    ctp "PRRTT-ES003/r01s1b10p01" payloadPos "02")
    Pour chaque conduit j'ai l'ensemble des ces attributs précédemment cités (Ex de conduit : c'est la référence qui se trouve après le mot "userLabel". On donc pour le premier conduit la référence: "CDTCD000021").

    Exemple du fichier brut (en gras les valeurs que je veux récupérer - le fichier complet est en pièce jointe):
    SET ntwId 24 END
    SET restDomId 1 END
    CREATEtrail
    userLabel "CDTCD000021"
    trailType pointToPoint
    flow bidirectional
    pmAutomatic false
    protType notProtected
    msProtProfile normal
    sdhAlrEnabRule onImplementation
    text1 "AR1-01"
    text2 "PRRTT-ES003/LOMM-ES003"
    sncpType sncpIpreferredAlr
    npaMainSpareFactor 100
    msspringDCFactor 80
    usageLevel 33
    fragmentationLevel 100
    supportedAu3 notMeaningful
    supportedLO notMeaningful
    intermCtpLoopback noIntLoop
    defaultRerouting preCalculated
    defaultPriority 4
    defaultSetupPriority 5
    defaultReversionMode automatic
    tu12OperState enabled
    autoPurge false
    endTpList
    ctp "LOMM5-ES003/r01s1b11p01" payloadPos "02"
    ctp "PRRTT-ES003/r01s1b10p01" payloadPos "02"
    END
    END
    CHOWNonObj trail
    userLabel "CDTCD000021"
    securityLabel 0
    END
    CONSTRtrail
    userLabel "CDTCD000021"
    port "LOMM5-ES003/r01s1b11p01" payloadPos "02" constraintType use section "main"
    port "PRRTT-ES003/r01s1b10p01" payloadPos "02" constraintType use section "main"
    END
    ALLOCtrail
    userLabel "CDTCD000021"
    END
    CONSTRtrail
    userLabel "CDTCD000021"
    END
    IMPLtrail
    userLabel "CDTCD000021"
    END
    CONFIGtrail
    userLabel "CDTCD000021"
    payloadStructure tu12Tu12Tu12
    END
    SET ntwId 24 END
    SET restDomId 1 END
    CREATEtrail
    userLabel "CDTCD000022"
    trailType pointToPoint
    flow bidirectional
    pmAutomatic false
    protType notProtected
    msProtProfile normal
    sdhAlrEnabRule onImplementation
    text1 "AR1-01"
    text2 "VENDI-ES001/PRRTT-ES003"
    sncpType sncpIpreferredAlr
    ...
    ####################################################
    Résultat souhaité

    Conduit / - /trailType/ - /protType/ - /Anneau/ - /EqtA/ - /EqtB/ - /......
    CDTCD000021/ - /pointToPoint/ - /notProtected/ - /AR1-01/ - /PRRTT-ES003 ......
    ####################################################


    Merci de votre aide.

    Voici mon script sur lequel je galère


    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    #!/usr/local/bin/perl
    use switch;
    use DBI;
    use strict;
    #Déclaration des variables
    my ($userLabel,$TrailType,$TypeProtec,$Anneau,$EqtA,$EqtB,$Eqt,$Emplacement,$AU, @TableauConduit);
     
    #Ouverture du fichier texte
    open FIC_CONDUIT,"< Conduit_CSR.txt" or die "Le fichier n'existe pas !";
    my $found = 0;
     
    #Déclaration des entêtes du fichier résultat
    print "Conduit\tType de Trail\tType de Protection\tAnneau\tEqtA\tEqtB\tEquipement\tCarte\tAU\n";
    while  (my $ligne = <FIC_CONDUIT>)
    {       #print $ligne;
            chomp($ligne);
     
            #Recherche de la référence du Conduit qui se trouve après le mot userLabel
            #userLabel "CDTCD000021" =>  CDTCD000021 = (userLabel)
            if ($ligne =~m/userLabel (")(CD[a-zA-Z0-9]+)(")/)
                    {
                    #$ligne =~m/userLabel (")(CD[a-zA-Z0-9]+)(")/;
                    $found++;
                    #print "$found\n";
                    $userLabel = $2;
                    print "\n$userLabel\t";
                    #print "$ligne";
                    }
     
            #Recherche du type de Trail qui se trouve après le mot trailType
            #trailType pointToPoint =>  pointToPoint = (TrailType)
            if ($ligne =~/trailType ([a-zA-Z]+)/)
                    {
                    #$ligne =~/trailType ([a-zA-Z]+)/;
                    $TrailType = $1;
                    print "$TrailType\t";
                    #print "$ligne";
                    }
     
            #Recherche du type de Protection qui se trouve après le mot protType
            #protType notProtected =>  notProtected = (TypeProtec)
            if ($ligne =~/protType ([a-zA-Z]+)/)
                    {
                    #$ligne =~/protType ([a-zA-Z]+)/;
                    $TypeProtec = $1;
                    print "$TypeProtec\t";
                    #print "$ligne \n";
                    }
     
            #Recherche de la référence de l'anneau qui se trouve après le mot text1 (cette référence n'est pas toujours déclarée)
            #text1 "AR1-01" => AR1-01 = (Anneau)
            if ($ligne =~/text1 (")(([a-zA-Z0-9]{3})-([0-9]+))(")/)
                    {
                    $Anneau = $2;
                    print "$Anneau\t";
                    }
     
            #Recherche des références EquipementA et EquipementB qui se trouve après le mot text2 (cette référence n'est pas toujours déclarée et les valeurs peuvent être vides)
            #text2 "PRRTT-ES003/LOMM-ES003" => PRRTT-ES003 = (EqtA)  LOMM-ES003 = (EqtB)
            if ($ligne =~/text2 (")([a-zA-Z0-9]+-[a-zA-Z0-9]+)\/(.*)(")/)
                    {
                    $EqtA = "";
                    $EqtB = "";
                    $EqtA = $2;
                    print "$EqtA\t";
                    $EqtB = $3;
                    print "$EqtB\t";
                    #print "$ligne\n";
                    }
     
            #Recherche des références EquipementA, CarteA, EquipementB, CarteB et AU qui se trouvent dans les deux lignes qui commencent par ctp
            #ctp "LOMM5-ES003/r01s1b11p01"   payloadPos "02"  => LOMM5-ES003=(EquipementA) r01s1b11p01=(CarteA)     02=(AU)
            #ctp "PRRTT-ES003/r01s1b10p01"   payloadPos "02"  => PRRTT-ES003=(EquipementB) r01s1b10p01=(CarteB)     02=(AU)
            if ($ligne =~/ctp (")([a-zA-Z0-9.]+-[a-zA-Z0-9]+)\/(.*)(")(.*)payloadPos(.)(")(\d+)(")/)
                    {
                    $Eqt = $2;
                    print "$Eqt\t";
                    $Emplacement = $3;
                    print "$Emplacement\t";
                    $AU = $8;
                    print $AU;
                    #print "$ligne\n";
                    }
     
            #Traitement de la définition du script non fait
            #Recherche des références Chemin Main, KLM, Chemin Spare, KLM dans les lignes qui commencent par port
            #port "LOMM5-ES003/r01s1b11p01"   payloadPos "02/2/2.2"    constraintType use    section "main"
            #port "PRRTT-ES003/r01s1b10p01"   payloadPos "02/2/2.2"    constraintType use    section "main"
            #port "LOMM5-ES003/r01s1b10p01"   payloadPos "02/2/2.2"    constraintType use    section "spare"
            #port "WEPPE-ES001/r01s1b10p02"   payloadPos "02/2/2.2"    constraintType use    section "spare"
     
     
            #Traitement de la définition du script non fait
            #Recherche du type de tructuration du conduit
            #payloadStructure tu12Tu12Tu12
     
            #Déclaration d'un tableu de hachage mais qui n'est pas utilisé pour l'instant
            my %Concatenation = ("Conduit" => "$userLabel",
                              "Type de trail" => "$TrailType",
                              "Tye de protection" => "$TypeProtec",
                              "Anneau" => "$Anneau",
                              "EquipementA" => "$EqtA",
                              "EquipementA" => "$EqtA",
                              "Equipement" => "$Eqt",
                              "Carte" => "$Emplacement",
                              "AU" => "$AU");
     
            #Insertion en ligne dans un tableau les attributs des conduits trouvés pour préparer l'insertion auto dans une base de données MySQL
            push @TableauConduit,$userLabel.";".$TrailType.";".$TypeProtec.";".$Anneau.";".$EqtA.";".$EqtB.";".$Eqt.";".$Emplacement.";".$AU."\n";
     
            #Réinitialisation des variables
            $TrailType = ""; $TypeProtec = ""; $Anneau = ""; $EqtA = ""; $EqtB = "";
            #push @TableauConduit,$userLabel.";".$TrailType.";".$TypeProtec.";".$Anneau.";".$EqtA.";".$EqtB."---".";".$Eqt.";".$Emplacement."\n";
     
            #Tri du tableau
            @TableauConduit = sort(@TableauConduit);
            #print %Concatenation; print "\n";
    }
     
    #Fermeture du fichier
    close (FIC_CONDUIT);
     
    #Insetion du contenu du tableau dans un fichier Excel pour vérifier le contenu et l'agencement
    foreach my $lignes (@TableauConduit)
            {
            open(FICCONDUIT,">>Conduittest2.csv");
            print FICCONDUIT $lignes;
            }
    close (FICCONDUIT);
    Fichiers attachés Fichiers attachés

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Complément d'info (premier résultat du script)
    Voici donc mon premier fichier résultat. Normalement une fois le script terminé, je dois insérer dans une base de donnée MySQL (je sais faire). Ci-joint le fichier résultat actuel qui ne correspond pas à ce que je veux.
    Fichiers attachés Fichiers attachés

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Une solution à me proposer ???
    Bonjour tout le monde,
    Je vous sollicite à nouveau par rapport à mon problème. Si c'est ma présentation des choses qui dérange, il faut me le dire. Une idée de votre part serait géniale. Je ne souhaite pas la solution complète mais un conseil sur la direction la mieux adaptée. Merci beaucoup pour votre aide.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Soyez patient,

    Les forumeurs ont une vie pendant les weekend.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ton problème le plus important, est que tu remplis la table @TableauConduit à chaque ligne de ton fichier d'entrée, alors que tu devrais le faire à chaque fin de conduit. Il faut donc que tu définisses une condition de fin de trail, basée, par exemple, sur la dernière ligne d'un trail (payloadStructure par exemple), à condition qu'il soit SYSTEMATIQUEMENT présent.
    Tu dois alors ne remplir ton tableau QUE sous la condition d'atteinte de ce dernier champ.
    De même d'ailleurs pour l'écriture des données à l'écran.
    Ainsi, j'écrirais la chose plutôt ainsi :

    while (my $ligne = <FIC_CONDUIT>) {
    ($userLabel) =~ /userLabel (?:")(CD[a-zA-Z0-9]+)(?:")/;

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ton problème le plus important, est que tu remplis la table @TableauConduit à chaque ligne de ton fichier d'entrée, alors que tu devrais le faire à chaque fin de conduit. Il faut donc que tu définisses une condition de fin de trail, basée, par exemple, sur la dernière ligne d'un trail (payloadStructure par exemple), à condition qu'il soit SYSTEMATIQUEMENT présent.
    Tu dois alors ne remplir ton tableau QUE sous la condition d'atteinte de ce dernier champ. Par ailleurs, déplace le tri du tableau à l'extérieur de la boucle, ce sera plus rapide.

    Ainsi, j'écrirais la chose plutôt ainsi :
    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
    while (my $ligne = <FIC_CONDUIT>) {
      if ($ligne =~ m/(?:")(CD[a-zA-Z0-9]+)(?:")/) {
        $userLabel = $1;
        $found++;
        ...
      }
      if (...) {
      }
      ...
      # On verifie qu'on a tout lu (qu'on a lu la dernière info)
      if (defined $AU) {
        push @TableauConduit, $userLabel.";".$TrailType.";".$TypeProtec.";".$Anneau.";".$EqtA.";".$EqtB.";".$Eqt.";".$Emplacement.";".$AU."\n";
        $TrailType = ""; $TypeProtec = ""; $Anneau = ""; $EqtA = ""; $EqtB = "";
        undef $AU;
      }
    }
     
    #Tri du tableau
    @TableauConduit = sort(@TableauConduit);
     
    #Insetion du contenu du tableau dans un fichier Excel pour vérifier le contenu et l'agencement
    foreach my $lignes (@TableauConduit) {
      open(FICCONDUIT,">>Conduittest2.csv");
      print FICCONDUIT $lignes;
    }
    close (FICCONDUIT);
    Au fait, dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        $EqtA = "";
        $EqtB = "";
        $EqtA = $2;
        print "$EqtA\t";
        $EqtB = $3;
        print "$EqtB\t";
    Les initialisations à "" sont inutiles

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Lorsque tu as plusieurs lignes contenant des infos (comme les deux lignes commençant par ctp) dois-tu les afficher dans deux paires de colonnes distinctes, ou dois-tu en sélectionner une des deux ? (et laquelle ?)

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour Philou,
    Encore merci pour ton aide.
    J'ai récemment pris en compte tes remarques et le résultat est bien meilleur. Concernant ta question sur les infos se trouvant dans les lignes commençant par "ctp", effectivement je dois les mettre dans des colonnes différentes.

    Je dois en extraire 6 valeurs (Equipement_A, Emplacement_A, AU_A, Equipement_B, Emplacement_B, AU_B). Malheureusement j'ai que les infos en "_A" qui ressortent dans mon tableau résultat.

    Voici mon nouveau script
    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
    55
    56
    57
    58
    59
     
    #!/usr/local/bin/perl
    open IN,"< Conduit_CSR.rmCmd" or die "Le fichier n'existe pas !";
    open(FIC, ">Conduittest2.xls" ) or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
    print {FIC}"Conduit\tType de Trail\tType de Protection\tAnneau\tEquipementA\tCarteA\tAUA\tEquipementB\tCarteB\tAUB\tStructure\n";
    while (<IN>) {
            if ( /userLabel "(\w{5})(\d{6})"/ ) {
                    $conduit = $1.$2;
                    #print FIC "$conduit\t";
            }
     
             if (/trailType ([a-zA-Z]+)/)
                    {
                    $TrailType = $1;
                    #print FIC "$conduit\t";
                    }
     
             if (/protType ([a-zA-Z]+)/)
                    {
                    $TypeProtec = $1;
                    #print FIC "$conduit\t";
                    }
     
            if (/text1 (")(([a-zA-Z0-9]{3})-([0-9]+))(")/)
                   {
                    $Anneau = $2;
                    #print FIC  "$Anneau\t";
     
                    }
            #Recherche des références EquipementA, CarteA, EquipementB, CarteB et AU qui se trouvent dans les deux lignes qui commencent par ctp
            #ctp "LOMM5-ES003/r01s1b11p01"   payloadPos "02"  => LOMM5-ES003=(EquipementA) r01s1b11p01=(CarteA)     02=(AU)
            #ctp "PRRTT-ES003/r01s1b10p01"   payloadPos "02"  => PRRTT-ES003=(EquipementB) r01s1b10p01=(CarteB)     02=(AU)
            if (/ctp (")([a-zA-Z0-9.]+-[a-zA-Z0-9]+)\/(.*)(")(.*)payloadPos(.)(")(\d+)(")/)
                    {
                    $Eqt = $2;
                    #print FIC  "$Eqt\t";
                    $Emplacement = $3;
                    #print FIC "$Emplacement\t";
                    $AU = $8; chomp $AU;
                    #print FIC "$AU\t";
                    }
     
             if (/payloadStructure ([a-zA-Z0-9.]+)/)
                    {
                    $Structure = $1;
                    #print FIC  "$Structure\n";
                     print "$conduit - $TrailType - $TypeProtec - $Anneau - $Eqt - $Emplacement - $AU - $Structure\n";
                    #print FIC $conduit."\t".$TrailType."\t".$TypeProtec."\t".$Anneau."\t".$Eqt."\t".$Emplacement."\t".$AU."\t"."\t"."\t"."\t".$Structure."\n";
                    }
                    else { next };
     
                    print FIC $conduit."\t".$TrailType."\t".$TypeProtec."\t".$Anneau."\t".$Eqt."\t".$Emplacement."\t".$AU."\t"."\t"."\t"."\t".$Structure."\n";
     
                    #Initialisation de la variable $Anneau pour les conduits ou le champ "text1" n'a pas été créé.
                    $Anneau = "Not defined";
     
    }
    #Fermeture du fichier
    close (IN);
    Je joins mon fichier résultat et mon fichier brut.

    Merci d'avance pour ton aide.
    Fichiers attachés Fichiers attachés

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Il y a une chose que je ne saisis pas : dans ton script, tu ouvres un fichier "Conduit_CSR.rmCmd" mais tu fournis un fichier "Conduit_CSR.txt" en pièce jointe. Erreur dans le script ?

    Sinon, voici où se situe ton principal problème : lorsque tu analyses les lignes ctp, tu ne mémorises qu'une seule des deux lignes. Pour bien faire, il faut te créer un tableau @Eqt, un tableau @Emplacement et un tableau @AU pour toutes les occurences de cpt d'un conduit. Tu ré-initialises ces tableaux à chaque nouveau conduit.

    Quant à l'écriture dans le fichier résultat, pourquoi ne pas la placer dans le if (/payloadStructure/) { ... } qui marque la fin de la définition du conduit. Ainsi, inutile d'utiliser le next, ce faux goto et d'éviter ainsi tout risque de sauter des instructions que tu ne souhaiterais pas (ce qui n'est pas le cas pour l'instant).

    J'écrirais donc quelque chose du genre :
    Code perl : 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
    #!/usr/local/bin/perl
    
    open IN,"< Conduit_CSR.rmCmd" or die "Le fichier n'existe pas !";
    open(FIC, ">Conduittest2.xls" ) or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
    print {FIC}"Conduit\tType de Trail\tType de Protection\tAnneau\tEquipementA\tCarteA\tAUA\tEquipementB\tCarteB\tAUB\tStructure\n";
    
    my (@Eqt, @Emplacement, @AU) = ();
    while (<IN>) {
      if ( /userLabel "(\w{5})(\d{6})"/ ) {
    ...
      if (/ctp (")([a-zA-Z0-9.]+-[a-zA-Z0-9]+)\/(.*)(")(.*)payloadPos(.)(")(\d+)(")/)
        {
          push @Eqt, $2;
          #print FIC  "$Eqt\t";
          push @Emplacement, $3;
          #print FIC "$Emplacement\t";
          push @AU, $8;
          #print FIC "$AU\t";
        }
      if (/payloadStructure ([a-zA-Z0-9.]+)/)
        {
          $Structure = $1;
          #print FIC  "$Structure\n";
          print "$conduit - $TrailType - $TypeProtec - $Anneau - $Eqt - $Emplacement - $AU - $Structure\n";
          #print FIC $conduit."\t".$TrailType."\t".$TypeProtec."\t".$Anneau."\t".$Eqt."\t".$Emplacement."\t".$AU."\t"."\t"."\t"."\t".$Structure."\n";
    
          chomp(@AU);
          print FIC "$conduit\t$TrailType\t$TypeProtec\t$Anneau\t$Eqt[0]\t$Emplacement[0]\t$AU[0]\t$Eqt[1]\t@Emplacement[1]\t@AU[1]\t$Structure\n";
          (@Eqt, @Emplacement, @AU) = ();
    
          #Initialisation de la variable $Anneau pour les conduits ou le champ "text1" n'a pas été créé.
          $Anneau = "Not defined";
        }
    }
    #Fermeture du fichier
    close (IN);

    Edit : attention, je n'ai pas testé (ni compilé) ce code.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour Philou,

    Merci beaucoup pour ton aide et tes conseils. Je ne passe pas encore le message en "Résolu" car j'ai un dernier traitement à faire. Sinon le traitement précèdent fonctionne très bien. J'ai toujours le même format de fichier en entrant concernant cette fois-ci des circuits. Un circuit possède un itinéraire "main" et un itinéraire "spare" => données issues des chaines de caractères commençant par "port". Le principe est-il toujours le même ?

    Merci pour ton aide.

    Mon premier traitement des circuits:
    (Fichier en pièce jointe)

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    #!/usr/local/bin/perl
    require "Connect_bd_casten2.pl";
    require "PrepaRequeteInsertEqt.pl";
    $PathResultat = "c:/Test_Perl/ResultatTraitement";
    $PathFicATraiter = "c:/Test_Perl/FichiersATraiter";
    open IN,"< $PathFicATraiter/CircuitNew.rmCmd" or die "Le fichier n'existe pas !";
    open(FIC, ">$PathResultat/Circuit.xls" ) or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
    print {FIC}"circuit\tserviceType\tpathRate\tAnneau\tEqtA\tEqtB\tEqtA_Bis\tCarteA\tEqtA_Bis2\tCarteA2\tKLM\tChemin\n";
    while (<IN>) {
          #Matcher le nom du circuit (Identification de début du circuit)
            if ( /userLabel "([a-zA-Z0-9_.-]+)"/ ) {
                    $circuit = $1.$2;
                    #print  "$circuit\t";
            }
     
             if (/serviceType ([a-zA-Z0-9.]+)/)
                    {
                    $serviceType = $1;
                    #print FIC "$conduit\t";
                    }
     
             if (/pathRate ([a-zA-Z0-9.]+)/)
                    {
                    $pathRate = $1;
                    #print FIC "$conduit\t";
                    }
     
            #if (/text1 (")(([a-zA-Z0-9]{3})-([0-9]+))(")/)
            if (/text1 (")([a-zA-Z0-9.-]+)(")/)
                   {
                    $Anneau = $2;
                    #print FIC  "$Anneau\t";
                    }
     
            if (/nap (")([a-zA-Z0-9.]+-[a-zA-Z0-9]+)\/(([a-zA-Z0-9.-]{8}+)p(\d+){2}(.*))(")/)
                   {
     
                    push @Eqt, $2; #print $Eqt[6]; print "\n";
                    push @Emplacement, $4; #print FIC "$Emplacement\t";
                    push @Port, $5; #print FIC "$Emplacement\t";
                    push @Position, $4.$5; #print FIC "$Emplacement\t";
     
                     #On récupère en base la PK de l'équipement en extrémité A
                     foreach $test_eqt (@Match_eqt1)
                      {
                             ($Num_eqt, $Nom_eqt ) = split( /;/, $test_eqt );
                             $Test_eqt = ( $Nom_eqt cmp $Eqt[0] );
                       if ( $Nom_eqt eq $Eqt[0] )
                            {
          	                 $FK_EqtA = $Num_eqt;
                             #print "$Num_eqt\n";
                             }
                      }
                      #On récupère en base la PK de la carte optique en extrémité A
                      foreach $test_carte (@Match_carte)
                      {
                              ($Num_carte, $FK_Eqt_Carte, $UserLabel_Carte, $Emplacement_Carte ) = split( /;/, $test_carte );
                              $Test_eqt = ( $Emplacement_Carte cmp $Emplacement[0] );
                      if ( ($UserLabel_Carte eq $Eqt[0]) && ($Emplacement_Carte eq $Emplacement[0]) )
                           {
                 	       $FK_CarteA = $Num_carte;
                           #print "$Num_eqt\n";
                           }
                      }
                      #On récupère en base la PK de l'équipement en extrémité B
                      foreach $test_eqt (@Match_eqt1)
                      {
                              ($Num_eqt, $Nom_eqt ) = split( /;/, $test_eqt );
                              $Test_eqt = ( $Nom_eqt cmp $Eqt[1] );
                      if ( $Nom_eqt eq $Eqt[1] )
                           {
                 	        $FK_EqtB = $Num_eqt;
                            #print "$Num_eqt\n";
                            }
                      }
                      #On récupère en base la PK de la carte optique en extrémité B
                      foreach $test_carte (@Match_carte)
                      {
                              ($Num_carte, $FK_Eqt_Carte, $UserLabel_Carte, $Emplacement_Carte ) = split( /;/, $test_carte );
                              $Test_eqt = ( $Emplacement_Carte cmp $Emplacement[1] );
                      if ( ($UserLabel_Carte eq $Eqt[1]) && ($Emplacement_Carte eq $Emplacement[1]) )
                           {
                 	        $FK_CarteB = $Num_carte;
                            #print "$Num_eqt\n";
                            }
                      }
                    }
     
            #if (/port (")(.*)\/(.*)(")   payloadPos (")(.*)(")(.*)(")(.*)(")/)
            if (/port (")([a-zA-Z0-9.]+-[a-zA-Z0-9]+)\/(.*)(")(.*)payloadPos (")(\d+)\/(\d+)\/(\d+).(\d+)(")(.*)/)
                   {
                     push @Eqt2, $2; #print $Eqt[6]; print "\n";
                     push @Emplacement2, $3; #print FIC "$Emplacement\t";
                     push @AU2, $7; #print FIC "$AU\t";
                     push @KLM, $8.$9.$10;
                     push @K, $8; push @L, $9; push @M, $10;
                    }
            #Matcher le un terme non redondant (Identification de la fin du circuit)
            if (/ALLOCpath/)
               {
                #print "$circuit - $serviceType - $pathRate - $Anneau - $Eqt[0] - $FK_EqtA - $Emplacement[0] - $FK_CarteA - $Port[0] - $Eqt[1] - $FK_EqtB - $Emplacement[1] - $FK_CarteB - $Port[1]\n";
                #Insertion_circuit ();
     
                print "$circuit - $Eqt2[0] - $FK_EqtA - $Emplacement2[0] - $FK_CarteA - $AU2[0] - $Eqt[1] - $FK_EqtB - $Emplacement[1] - $FK_CarteB - $Port[1] - $KLM[0]\n";
                (@Eqt, @Emplacement, @Port, @Position) = ();
                $Anneau = "Not defined";
                $circuit = "Not defined";
     
                }
     
    }
    #Fermeture du fichier
    close (IN);
     
    sub Insertion_circuit
    	{
    $sql = "INSERT INTO tu (PK_tu, circuit , ServiceType , PathRate, Anneau, Eqt_A, FK_EqtA,EmplacementA,FK_CarteA,PortA, Eqt_B, FK_EqtB, EmplacementB, FK_CarteB, PortB)
    VALUES ('', '$circuit', '$serviceType', '$pathRate', '$Anneau', '$Eqt[0]', '$FK_EqtA', '$Emplacement[0]', '$FK_CarteA', '$Port[0]', '$Eqt[1]', '$FK_EqtB', '$Emplacement[1]', '$FK_CarteB', '$Port[1]');";
    $dbh->do($sql);
    }
     
    sub Insertion_itineraire
    	{
    $sql = "INSERT INTO itineraire_tu (PK_tu, circuit , ServiceType , PathRate, Anneau, Eqt_A, FK_EqtA,EmplacementA,FK_CarteA,PortA, Eqt_B, FK_EqtB, EmplacementB, FK_CarteB, PortB)
    VALUES ('', '$circuit', '$serviceType', '$pathRate', '$Anneau', '$Eqt[0]', '$FK_EqtA', '$Emplacement[0]', '$FK_CarteA', '$Port[0]', '$Eqt[1]', '$FK_EqtB', '$Emplacement[1]', '$FK_CarteB', '$Port[1]');";
    $dbh->do($sql);
    }
    Traitement définitif des conduits qui fonctionne:
    (Fichier en pièce jointe)

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    #!/usr/local/bin/perl
    use DBI;
    require "Connect_bd_casten2.pl";
    require "PrepaRequeteInsertEqt.pl";
    $PathResultat = "c:/Test_Perl/ResultatTraitement";
    $PathFicATraiter = "c:/Test_Perl/FichiersATraiter";
    open IN,"< $PathFicATraiter/ConduitsNew.rmCmd" or die "Le fichier n'existe pas !";
    open(FIC, ">$PathResultat/Conduittest2.xls" ) or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
    print {FIC}"Conduit\tTypeTrail\tTypeProtection\tAnneau\tEquipementA\tPK_EqtA\tCarteA\tPK_CarteA\tAUA\tEquipementB\tPK_EqtB\tCarteB\tPK_CarteB\tAUB\tStructure\n";
    while (<IN>)
    {
          if ( /userLabel "(\w{5})(\d{6})"/)
             {
               $conduit = $1.$2; #print FIC "$conduit\t";
             }
          if (/trailType ([a-zA-Z]+)/)
             {
             $TrailType = $1; #print FIC "$conduit\t";
             }
          if (/protType ([a-zA-Z]+)/)
             {
              $TypeProtec = $1; #print FIC "$conduit\t";
             }
          if (/text1 (")(([a-zA-Z0-9]{3})-([0-9]+))(")/)
             {
              $Anneau = $2; #print FIC  "$Anneau\t";
             }
          if (/ctp (")([a-zA-Z0-9.]+-[a-zA-Z0-9]+)\/(.*)(")(.*)payloadPos(.*)(")(\d+)(")/)
             {
              push @Eqt, $2; #print $Eqt[6]; print "\n";
              push @Emplacement, $3; #print FIC "$Emplacement\t";
              push @AU, $8; #print FIC "$AU\t";
     
              #On récupère en base la PK de l'équipement en extrémité A
              foreach $test_eqt (@Match_eqt1)
                      {
                      ($Num_eqt, $Nom_eqt ) = split( /;/, $test_eqt );
                      $Test_eqt = ( $Nom_eqt cmp $Eqt[0] );
                      if ( $Nom_eqt eq $Eqt[0] )
                         {
                 	     $FK_eqtA = $Num_eqt;
                         #print "$Num_eqt\n";
                         }
                      }
              #On récupère en base la PK de la carte optique en extrémité A
              foreach $test_carte (@Match_carte)
                      {
                      ($Num_carte, $FK_Eqt_Carte, $UserLabel_Carte, $Emplacement_Carte ) = split( /;/, $test_carte );
                      $Test_eqt = ( $Emplacement_Carte cmp $Emplacement[0] );
                      if ( ($UserLabel_Carte eq $Eqt[0]) && ($Emplacement_Carte eq $Emplacement[0]) )
                         {
                 	     $FK_CarteA = $Num_carte;
                         #print "$Num_eqt\n";
                         }
                      }
              #On récupère en base la PK de l'équipement en extrémité B
              foreach $test_eqt (@Match_eqt1)
                      {
                      ($Num_eqt, $Nom_eqt ) = split( /;/, $test_eqt );
                      $Test_eqt = ( $Nom_eqt cmp $Eqt[1] );
                      if ( $Nom_eqt eq $Eqt[1] )
                         {
                 	     $FK_eqtB = $Num_eqt;
                         #print "$Num_eqt\n";
                         }
                      }
              #On récupère en base la PK de la carte optique en extrémité B
              foreach $test_carte (@Match_carte)
                      {
                      ($Num_carte, $FK_Eqt_Carte, $UserLabel_Carte, $Emplacement_Carte ) = split( /;/, $test_carte );
                      $Test_eqt = ( $Emplacement_Carte cmp $Emplacement[1] );
                      if ( ($UserLabel_Carte eq $Eqt[1]) && ($Emplacement_Carte eq $Emplacement[1]) )
                         {
                 	     $FK_CarteB = $Num_carte;
                         #print "$Num_eqt\n";
                         }
                      }
              }
          if (/payloadStructure ([a-zA-Z0-9.]+)/)
             {
              $Structure = $1; #print FIC  "$Structure\n";
              print "$conduit - $TrailType - $TypeProtec - $Anneau - $Eqt[0] - $FK_eqtA - $Emplacement[0] - $FK_CarteA - $AU[0] - $Eqt[1] - $FK_eqtB - $Emplacement[1] - $FK_CarteB - $AU[1] - $Structure\n";
              #Insertion_conduit ();
              #chomp(@AU);
              print FIC "$conduit\t$TrailType\t$TypeProtec\t$Anneau\t$Eqt[0]\t$FK_eqtA\t$Emplacement[0]\t$FK_CarteA\t$AU[0]\t$Eqt[1]\t$FK_eqtB\t@Emplacement[1]\t$FK_CarteB\t@AU[1]\t$Structure\n";
              #Initialisation de la variable $Anneau pour les conduits ou le champ "text1" n'a pas été créé.
              #Insertion_conduit ();
              (@Eqt, @Emplacement, @AU) = ();
              $Anneau = "Not defined";
              $FK_eqtA = "Not defined";
              $FK_CarteA = "Not defined";
     
              }
     
    }
    #Fermeture du fichier
    close (IN);
     
    sub Insertion_conduit
    	{
    $sql = "INSERT INTO conduit (PK_conduit, UserLabel , TrailType , ProtType, Anneau, EqtA, FK_EqtA, EmplacementA, FK_CarteA, AUA, EqtB, FK_EqtB, EmplacementB,
    FK_CarteB, AUB, Structure)
    VALUES ('', '$conduit', '$TrailType', '$TypeProtec', '$Anneau', '$Eqt[0]', '$FK_eqtA', '$Emplacement[0]', '$FK_CarteA', '$AU[0]', '$Eqt[1]', '$FK_eqtB', '$Emplacement[1]', '$FK_CarteB', '$AU[1]', '$Structure');";
    $dbh->do($sql);
    }
    Fichiers attachés Fichiers attachés

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par Patrice.peace Voir le message
    Le principe est-il toujours le même ?
    Ton problème est ancien, et tes scripts assez longs et complexes, difficile de se remettre dans le bain. Cela dit, je ne vois pas de raison pour que le principe ne soit pas identique. Veux-tu dire que ton script ne fonctionne pas ?

Discussions similaires

  1. Formater correctement des données dans un fichier texte
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 15/08/2007, 22h44
  2. [vb6]:Ajuster des données dans un fichier text avec un timer
    Par gaetan.tranvouez dans le forum VB 6 et antérieur
    Réponses: 25
    Dernier message: 28/07/2006, 12h13
  3. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00
  4. Réponses: 2
    Dernier message: 16/01/2006, 19h34
  5. Réponses: 3
    Dernier message: 22/02/2004, 20h09

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