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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 6
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 6
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 6
    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 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    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 : 59
    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
    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 : 59
    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
    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 : 59
    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
    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 ?)

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