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 de caractères dans un fichier texte


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Extraction de caractères dans un fichier texte
    Bonjour,

    Je travail sur le découpage de données contenues dans un fichier texte.
    Ce fichier se présente sous une forme similaire:

    inf_agh{100120141045@00000000000~03Module_010000~04Module020000@0000000{100120141045@00000000000~03Module_010000~04Module020000@0000000}04052014\


    Mon objectif est de regrouper sous forme de tableau les données correspondant à des cartes "00000000000" situées entre les symboles "@" et "~" ou "@" et"}" .
    Les données correspondant à des modules "03Module_010000" situées entre les symboles "~" et "~" ou "~" et "@".

    J'ai réalisé le code suivant, mais au niveau du traitement des éléments "cartes" et "modules", seules les premières occurrences sont insérées dans le tableau correspondant.

    résultat obtenu:

    date: 100120141045
    carte: 00000000000
    module: 03Module_010000


    code:

    #decoupage du fichier
    while ($ligne = <lire>){


    #recuperation des elements compris entre [{ et @]

    if ($ligne =~ /\{(\d*)@/) {
    @date=$1
    }
    #si la ligne est comprise entre les symboles [@ et ~] et entre [@ et }]
    if ($ligne =~ /@(\d*)[~|\}]/){
    @carte=$1;
    }
    #si la ligne est comprise entre les caracteres [~ et ~] ou [~ et @]
    if ($ligne =~ /~(\w*)[~|@]/){
    @module=$1;
    }
    }


    Je vous remercie d'avance pour votre aide =)

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    je pense que tu ne dois garder que la dernière occurrence plutôt non?

    essaie :

    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
    #decoupage du fichier
    while ($ligne = <lire>){
       #recuperation des elements compris entre [{ et @]
       if ($ligne =~ /\{(\d*)@/) {
          push(@date, $1);
       }
       #si la ligne est comprise entre les symboles [@ et ~] et entre [@ et }]
       if ($ligne =~ /@(\d*)[~|\}]/){
          push(@carte, $1);
       }
       #si la ligne est comprise entre les caracteres [~ et ~] ou [~ et @]
       if ($ligne =~ /~(\w*)[~|@]/){
          push(@module, $1);
       }
    }
    PS: pense à mettre ton code entre les balises # pour que ce soit plus lisible

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Oui effectivement, c'est plutôt la dernière occurence, merci.

    Le code que vous me proposez ne modifie rien au résultat obtenu.
    C'est comme si les valeurs enregistrées dans le tableau étaient écrasés à chaque fois, ou bien les lignes présentent dans mon fichier ne sont pas lues entièrement.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    si tu fais comme ça tu auras une idée du problème:
    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
    #decoupage du fichier
    while ($ligne = <lire>){
       print $ligne;
       #recuperation des elements compris entre [{ et @]
       if ($ligne =~ /\{(\d*)@/) {
          print "\t$1\n";
          push(@date, $1);
       }
       #si la ligne est comprise entre les symboles [@ et ~] et entre [@ et }]
       if ($ligne =~ /@(\d*)[~|\}]/){
          print "\t$1\n";
          push(@carte, $1);
       }
       #si la ligne est comprise entre les caracteres [~ et ~] ou [~ et @]
       if ($ligne =~ /~(\w*)[~|@]/){
          print "\t$1\n";
          push(@module, $1);
       }
    }
    tu pourras voir si toutes tes lignes sont traitées
    ensuite tu pourras vérifier la taille de tes array

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour le coup de pousse! =)
    Mes tableaux n'étaient composés que d'un seul élément, donc je ne pouvais pas aller très loin.

    En fait mon problème était que je ne récupérais qu'un élément correpondant à l'expression régulière par ligne.
    Il suffisait juste de remplacer le "if" par un "foreach" !

    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
    #decoupage du fichier
    while ($ligne = <lire>){
     
       #recuperation des elements compris entre [{ et @]
       foreach my $d ($ligne =~ /\{(\d*)@/g) {
          push(@date, $d);
       }
       #si la ligne est comprise entre les symboles [@ et ~] et entre [@ et }]
       foreach my $c ($ligne =~ /@(\d*)[~|\}]/g){
          push(@carte, $c);
       }
       #si la ligne est comprise entre les caracteres [~ et ~] ou [~ et @]
       foreach my $m ($ligne =~ /~(\w*)[~|@]/g){
          push(@module, $m);
       }
    }
    Merci encore et bonne journée!

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Attention car ce n'est clairement pas bon de parcourir 3 fois tout le fichier
    je n'avais clairement pas regardé cette partie
    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
    #decoupage du fichier
    open(FH_IN, 'monfichier.txt');
    while (<FH_IN>){
       #recuperation des elements compris entre [{ et @]
       if ($_ =~ /\{(\d*)@/g) {
          push(@date, $1);
       }
       #si la ligne est comprise entre les symboles [@ et ~] et entre [@ et }]
       if ($_ =~ /@(\d*)[~|\}]/g){
          push(@carte, $1);
       }
       #si la ligne est comprise entre les caracteres [~ et ~] ou [~ et @]
       if ($_ =~ /~(\w*)[~|@]/g){
          push(@module, $1);
       }
    }

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 6
    Points
    6
    Par défaut ajouter un un retour chariot dans un fichier txt
    Bonjour,

    je ne sais pas où ni à qui poser ma question , vu que le traitement de fichier txt a été abordé ici alors me voilà avec ma question,
    je n'arrive pas à ajouter un retour chariot dans un fichier txt avec instruction perl en ligne de commande. Ce fichier txt comporte des données de type:

    <A> ..... </A><B>.....</B>...<A>.. etc
    En fait j'aimerai faire un retour chariot avant chaque < suivi d'une lettre Maj

    Merci de votre aide!

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Prière de ne pas squatter le post d'un autre, c'est considéré comme manquand de politesse sur tous les forums que je connais. Crée plutôt un nouveau post.

    J'allais répondre tout de même par gentillesse et pour te dépanner, mais je préfère finalement m'abstenir, parce que si tu as une autre question ou ne comprends pas ma solution, tu seras obligé de répondre encore une fois sur ce post. Non, vraiment, ouvre un nouveau post, c'est promis, je répondrai si personne ne le fait avant.

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 6
    Points
    6
    Par défaut désolée
    Désolé de m’incruster dans ton poste mais je n'ai pas la possibilité de créer un nouveau poste, je n'arrive pas à le faire! bon ce n'est pas une raison de squatter ici mais j désespéré ...

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Va sur cette page : http://www.developpez.net/forums/f47.../perl/langage/ et appuie sur le bouton "Ouvrir une nouvelle discussion".

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Va sur cette page : http://www.developpez.net/forums/f47.../perl/langage/ et appuie sur le bouton "Ouvrir une nouvelle discussion".
    merci, je vais pouvoir le faire correctement!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] extraction caractère d'une chaine de caractère dans un fichier texte
    Par Zoïïc dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 24/06/2014, 19h20
  2. 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
  3. Réponses: 3
    Dernier message: 07/06/2006, 14h40
  4. Réponses: 3
    Dernier message: 27/06/2005, 16h24
  5. Réponses: 5
    Dernier message: 25/01/2005, 14h26

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