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 :

modifier une ligne d'un fichier.txt avec perl


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Points : 15
    Points
    15
    Par défaut modifier une ligne d'un fichier.txt avec perl
    Bonjour,
    Je voudrai manipuler un fichier .txt. En effet, chaque ligne a la forme suivante:

    (école) école/NOUN+HJ/CASE_INDEF_ACC
    Je voudrai que la ligne aura la forme suivante:

    école NOUN
    Je me suis bloquée. Et je n'ai pas su comment procéder?
    Pouvez vous m'aider? Et merci.

  2. #2
    Rédacteur/Modérateur

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

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

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

    il faudrait que tu donnes un exemple de fichier un peu plus long pour que l'on puisse mieux comprendre comment on reconnaît les éléments que tu veux garder.

    De plus, dans ton résultat:
    - le mot "école" doit-il provenir du mot école situé entre paranthèses en début de ligne dans le fichier en entrée ou du mot école précédant le caractère / ? Ou faut-il que ce soit toujours "école"?
    - le mot NOUN du résultat correspond-il à ce qui se trouve entre les caractères / et + du fichier en entrée?

  3. #3
    Membre actif Avatar de brice45
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 188
    Points : 236
    Points
    236
    Par défaut
    Bonjour,

    Peux-tu nous donner plus de lignes de ton fichier d'origine ?
    Merci

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Voici une partie de mon fichier:

    (je) je/PP/Singulier
    (vais) vais/VERB/Present/Singulier
    (à) à/PREP
    (une) une/DET/Indef
    (nouvelle) nouvelle/ADJ+IK/CASE_INDEF_ACC
    (école) école//NOUN+HJ/CASE_INDEF_ACC
    Je voudrai obtenir:
    je PP
    vais VERB
    à PREP
    une DET
    nouvelle ADJ
    école NOUN
    Sachant que le premier mot dans le fichier souhaité est celui entre parenthèses

  5. #5
    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
    Tu peux essayer ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (<INPUT>) {
         print "$1 $2 \n" if /\((\w+)\).*\/(\w+)\//;
    }

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (<INPUT>) {
         print "$1 $2 \n" if /\((\w+)\).*\/(\w+)\//;
    }
    Que voulez vous dire par INPUT dans la boucle while??

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    INPUT est le handle du fichier en entrée, tu peux l'appeler ENTREE si tu préfères (ou ce que tu veux).

    Tu peux ouvrir le fichier avec une commande de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open INPUT, "<mon_fichier_en_entree" or die "ouverture impossible $!\n";
    Ensuite, while (<INPUT>) lit toutes les lignes du fichier une à une.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    J'ai essayé le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    open(FILE,"<fichier.txt");
    while (<FILE>) {
        print "$1 $2 \n" if /\((\w+)\).*\/(\w+)\//;
    }
    Mais, rien ne s'affiche

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Pouvez vous m'expliquer le role de chaque caractère dans la condition if:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "$1 $2 \n" if /\((\w+)\).*\/(\w+)\//;

  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
    Je viens d'essayer avec ton code et ton fichier en entrée, ça me donne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ perl test_fic.pl
    je PP
    vais Present
    une DET
    Donc, ça marche, mais seulement partiellement, parce que mon expression régulière était construite sur la supposition que les mots entre / .../ ne comportaient que des lettres.

    Il faut donc modifier légèrement pour tenir compte des +.

    Nouveau code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    open(FILE,"<fichier.txt");
    while (<FILE>) {
        print "$1 $2 \n" if /\((\w+)\).*\/(\w+)[+\/]/;
    }
    Ce qui me donne le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ perl test_fic.pl
    je PP
    vais Present
    une DET
    nouvelle ADJ
    ecole NOUN

  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 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
    Je t'explique le code de la nouvelle expression régulière, en mettant les différents morceaux à la ligne pour expliquer chacun:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /     début de l'expression régulière
    \(    reconnaît une parenthèse (les parenthèses étant des caractères spéciaux il faut faire \( pour reconnaître une parenthèse
    (     parenthèse servant à regrouper les caractères et à les capturer dans $1 et $2
    \w+   1 ou plusieurs caractères alphanumériques
    )      parenthèse de regroupement et de capture fermante
    \)     reconnaît une parenthèse fermante
    .*     0 ou plusieurs caractères quelconques
    \/    reconnaît le caractère / (le slash étant un caractère spécial, il fait \/ pour reconnaître un /
    (     parenthèse pour regrouper et capturer
    \w+ 1 ou plusieurs caractères alphanumériques
    )     parenthèse fermante de regroupement et capture
    [+\/]  caractère + ou caractère /
    /     fin de l'expression régulière.
    Pour une capture relativement simple comme celle-ci, les expressions régulières sont généralement plus simples, mais celle-ci est compliquée par le fait que texte à analyser contient des signes (parenthèses ouvrantes et fermantes, / et +) qui ont un rôle particulier dans les expressions régulières et qu'il faut donc à chaque fois précéder par un \.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Je vous remercie infiniment pour votre explication fructueuse.
    Mais, en fait, j'ai des lignes dans le fichier .txt qui ont la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (>uxoraY) >uxoraY/ADJ
    (laHiqat) laHiq/PV+at/PVSUFF_SUBJ
    (bi-) bi-/PREP
    (-hA) -hA/PRON_3FS
    (>aDorArN) >aDorAr/NOUN+N/CASE_INDEF_NOM
    (.) ./PUNC
    (() (/PUNC
    (w) w/ABB
    (S) S/ABBR
    (ruwyotirz) ruwyotirz/NOUN_PROP
    (>b) >b/ABBREV
    le \w+ permet de reconnaitre les caractères alphanumériques, mais, on constate que les mots peuvent contenir des caractères spéciaux. Comment faire dans ce cas?

  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 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
    Dans ce cas, il faut une définition beaucoup plus rigoureuse du fichier en entrée.

    Le mot entre parenthèses au début peut-il contenir une parenthèse fermante? Si c'est le cas, il faut trouver un autre moyen de distinguer ce mot. Peut-être l'espace après?

    De même pour le deuxième mot à récupérer. Je pensais qu'il était encadré par des /, avec éventuellement un +. Si ce n'est pas le cas, il faut préciser comment on peut le reconnaître. Ce sont des choses que je ne peux pas deviner.

  14. #14
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Bon, j'ai pu surmonter le problème précedent en utilisant le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    open(FILE,"<fichier.txt");
    while (<FILE>) {
        print "$1 $2 \n" if /\((.+)\).*\/(.+)[\n+\/]/;
    }
    Mais, j'ai constaté qu'il ne traite pas la dernière ligne.

    De plus, le format du fichier.txt est le suivant:

    (je) je/PP/Singulier
    (vais) vais/VERB/Present/Singulier
    (à) à/PREP
    (une) une/DET/Indef
    (nouvelle) nouvelle/ADJ+IK/CASE_INDEF_ACC
    (école) école//NOUN+HJ/CASE_INDEF_ACC

    (>uxoraY) >uxoraY/ADJ
    (laHiqat) laHiq/PV+at/PVSUFF_SUBJ
    (bi-) bi-/PREP
    (-hA) -hA/PRON_3FS
    (>aDorArN) >aDorAr/NOUN+N/CASE_INDEF_NOM
    (.) ./PUNC
    (() (/PUNC
    (w) w/ABB
    (S) S/ABBR
    (ruwyotirz) ruwyotirz/NOUN_PROP
    (>b) >b/ABBREV
    J'ai utilisé le code ci-dessus sur le fichier, et j'ai obtenu le résultat suivant:
    je Singulier
    vais Singulier
    à PREP
    une Indef
    nouvelle CASE_INDEF_ACC
    école CASE_INDEF_ACC
    >uxoraY ADJ
    laHiq PVSUFF_SUBJ
    bi- PREP
    -hA PRON_3FS
    >aDorAr CASE_INDEF_NOM
    . PUNC
    ( PUNC
    w ABB
    S ABBR
    ruwyotirz NOUN_PROP
    Que dois je faire?

  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 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
    Tu dois donner une description complète de ton fichier.

  16. #16
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Je vous remercie infiniment pour votre aide.

  17. #17
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    La dernière ligne n'est pas traitée sans doute parce qu'elle n'a pas de retour à la ligne, alors que ton expression régulière attend à la fin du mot à reconnaître un retour à la ligne, un / ou un +. S'il n'y a aucun des trois, l'expression régulière échoue.

    Par ailleurs, ton programme ne marchera pas comme tu le désires, je pense, si tu rencontres une ligne de ce genre:

    C'est pour cela que je dis qu'il faudrait être plus précis dans la description du fichier.

Discussions similaires

  1. modifier une ligne dans un fichier .txt
    Par javjouv2011 dans le forum MATLAB
    Réponses: 10
    Dernier message: 19/07/2013, 16h38
  2. code java pour modifier une ligne dans un fichier txt
    Par pacomou dans le forum Général Java
    Réponses: 1
    Dernier message: 03/09/2009, 15h23
  3. Modifier une ligne dans un fichier txt en java
    Par nihad510 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 09/10/2007, 22h08
  4. extraction d'une ligne d'un fichier txt
    Par tim69000 dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 19/01/2006, 15h28
  5. Modifier une ligne d'un fichier
    Par jula dans le forum Linux
    Réponses: 4
    Dernier message: 08/04/2005, 17h24

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