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 :

Comment lire un fichiet texte dans un script perl


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 41
    Points : 41
    Points
    41
    Par défaut Comment lire un fichiet texte dans un script perl
    Bonjour,

    J'ai un code qui donne en sortie un fichier texte de TreeTagger, jusqu'au là il ne y'a pas de problème, mon code ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @textTab = split (/[ ,;!?\"\'\.:]/, "debut toto titi tata abcd fin");
     
    open(FileTemp, ">toto.tmp");
     
    foreach $elmt (@textTab) {
    	print FileTemp $elmt,"\n";
    }
    close(FileTemp);
     
    system("bin/tree-tagger -token -lemma -no-unknown lib/english-utf8.par toto.tmp toto.out");
    Le problème c'est que j'ai besoin d'appliquer le treeTagger sur un fichiet texte de coup au lieu d'écrire les mots directement sur le code, ici c'est le cas de "debut toto titi tata abcd fin" , je veux écrire le chemin qui mène au fichier d'entrée ! je connais pas la syntaxe pour faire ça ! j'ai cherché sur internet mais je ne trouve rien. Merci de m'aider

  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
    Pas sûr d'avoir bien compris et pas assez d'information sur à quoi ressemble le fichier en entrée, mais peut-être quelque chose comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $fic_entree = "entree.txt";
    open my $FH_IN, "<", $fic_entree or die "Ouverture impossible du fichier $fic_entree $!";
    while (my $ligne = <$FH_IN>) {     # lit le fichier en entrée ligne par ligne
         @mots = split ...
         # ...
    }
    Observe la syntaxe "à trois arguments" pour ouvrir le fichier et la vérification que l'ouverture a fonctionné, et pense à faire la même chose pour ton fichier de sortie.

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 41
    Points : 41
    Points
    41
    Par défaut
    Merci bcp pour ta réponse, mais comment fusionner le script que tu m'a donné avec le mien (je précise je connais presque rien sur Perl) !
    Le nouveau script ne dois pas contenir les mots "debut toto titi tata abcd fin" qui figurent dans le premier script mais à la place il doit centenir le chemin d'un fichier texte (déja crée) qui contient une centaine de mots, histoire de faire un script plus géneral. En fait le fichier d'entrée est un fichier texte normal qui contient des paragraphes.

  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 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,

    si tu ne fournis pas un échantillon du fichier en entrée, je ne peux pas être sûr de comment éplucher son contenu. Voici une possibilité en supposant que le fichier à plusieurs lignes et que chaque ligne contient plusieurs mots. Si une de ces deux hypothèses est fausse, alors le code peut être simplifié. Mets STP un échantillon de tes données en entrée.


    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
     
    use strict;
    use warnings;
     
    my $fic_entree = "entree.txt";
    open my $FH_IN, "<", $fic_entree or die "Ouverture impossible du fichier $fic_entree $!";
     
    open my $FH_OUT, ">", "toto.tmp" or die "Ouverture impossible du fichier toto.tmp $!";
     
    while (my $ligne = <$FH_IN>) {     # lit le fichier en entrée ligne par ligne
         my @textTab = split (/[ ,;!?\"\'\.:]/, $ligne;
         foreach my $elmt (@textTab) {
    	  print $FH_OUT $elmt,"\n";
         }
    }
    close $FH_OUT;
    close $FIC_OUT;
     
    system("bin/tree-tagger -token -lemma -no-unknown lib/english-utf8.par toto.tmp toto.out");
    J'ai modifié ta syntaxe car elle correspond aux normes de codage Perl d'il y a plus de 10 ans. Même si ta syntaxe marche encore, le code ci-dessus respecte beaucoup plus les "bonnes pratiques" admises dans le communauté Perl.

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 41
    Points : 41
    Points
    41
    Par défaut
    Parfait !!! ça marcher ! Mercii infiniment, j'ai passer de temps pour faire ceci, je vous remercie une fois de plus

    Voici à quoi ressemble une partie de mon fichier d'entrée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    25047025
    MISSING INFO
    Effects of traumatic brain injury on reactive astrogliosis and seizures in mouse models of Alexander disease.
    <disease>Alexander disease</disease> ( AxD ) is only known human pathology caused by mutations in astrocyte-specific gene , glial fibrillary acidic protein ( GFAP )


    par contre en faisant ça ! ça saute la premiere ligne de fichier d'entrée et ça traite la suite j'aimerais savoir pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    my $fic_entree = "entree.txt";
    open my $FH_IN, "<", $fic_entree or die "Ouverture impossible du fichier $fic_entree $!";
     
    while (my $ligne = <$FH_IN>) {     # lit le fichier en entrée ligne par ligne
    	my @textTab = split (/[ ,;!?\"\'\.:]/, $ligne);
    	open(FileTemp, ">toto.tmp");
    	foreach my $elmt (@textTab) {
    		print FileTemp $elmt,"\n";
    	}
    }
     
    close(FileTemp);
     
    system("bin/tree-tagger -token -lemma -no-unknown lib/english-utf8.par toto.tmp toto.out");
    Une dernière question svp ! à quoi ça sert le my et le use ? Je sais que c'est un peu débile comme question mais ça sera plus débile de ne pas les connaitre

    Une derniere remarque, j'ai effacé close $FIC_OUT; dans ta syntaxe parce que j'ai pas trouvé $FIC_OUT dans le reste de code, j'espère que j'ai pas fait une connerie

  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 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
    Citation Envoyé par Derfh Voir le message
    par contre en faisant ça ! ça saute la premiere ligne de fichier d'entrée et ça traite la suite j'aimerais savoir pourquoi

    [CODE]my $fic_entree = "entree.txt";
    open my $FH_IN, "<", $fic_entree or die "Ouverture impossible du fichier $fic_entree $!";

    while (my $ligne = <$FH_IN>) { # lit le fichier en entrée ligne par ligne
    my @textTab = split (/[ ,;!?\"\'\.:]/, $ligne);
    open(FileTemp, ">toto.tmp");
    foreach my $elmt (@textTab) {
    print FileTemp $elmt,"\n";
    }
    }

    close(FileTemp);
    Le problème est dû au fait que tu ouvres le fichier de sortie à l'intérieur de la boucle lisant le fichier en entrée. Du coup, tu ouvres le fichier en sortie autant de fois qu'il y a des lignes en entrée. Et chaque fois que tu ouvres un fichier en sortie avec ">", tu crées un nouveau fichier et, donc, effaces ce qui a été créé précédemment. Il est probable qu'en changeant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open(FileTemp, ">toto.tmp");
    en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open(FileTemp, ">>toto.tmp");
    ça marcherait à peu près. Mais ça resterait très inefficace. Cela n'a pas forcément beaucoup d'importance sur un fichier en entrée de quelques lignes, mais ce serait très différent avec un gros fichier.

    Sur le my et le use: Perl est un langage qui a 26 ans. Il s'est beaucoup modernisé depuis sa première version, mais il a tenu à rester compatible dans la mesure du possible. Les directives de compilation "use strict;" et "use warnings;" imposent un contrôle de la syntaxe beaucoup plus strict que ce qui existait à l'époque. Et c'est super-utile, parce que le compilateur te prévient si tu utilises une variable qui n'a pas été initialisée (par exemple). Du coup, si tu écris "$toto = 33;", et utilises plus loin "$value = $toti;", Perl te dira que tu as fait une erreur dans le nom de la variable. Pour que ça fonctionne, il faut déclarer toute variable que tu utilises avec "my".

    Sur le code:
    c'est juste une erreur de ma part, je voulais avoir:
    mais, par chance pour toi, il n'est pas pas vraiment nécessaire ici de fermer le fichier en entrée, c'est juste souvent un peu plus propre de le faire.

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 41
    Points : 41
    Points
    41
    Par défaut
    Je vous remercie énormement pour tous ces informations,franchement je dormirai moins bete ce soir. Je viens de découvrir le langage Perl derniérement grâce à un projet de classification et je m'attendais pas qu'il soit super interessent! Je me demande est ce que on peut même manipuler les données dans un fichier texte avec ce langage ? genre compter le nombre d'occurrence d'un mot ou supprimer des lignes ou copier le contenu... des manipulations de genre

  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
    Bonjour,

    Oui, non seulement on peut le faire, mais Perl est sans doute l'un des meilleurs langages (à mon humble avis LE meilleur) pour manipuler les données textuelles. Son efficacité sur ce genre de problème est réellement redoutable. Mais, bien sûr, ça demande un peu d'apprentissage. Il y a plusieurs tutoriaux intéressants sur ce site pour apprendre le langage.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/06/2007, 11h15
  2. Réponses: 2
    Dernier message: 14/04/2006, 11h20
  3. Comment lancer un script perl dans un script perl
    Par kiza dans le forum Langage
    Réponses: 3
    Dernier message: 21/10/2005, 21h02
  4. Réponses: 5
    Dernier message: 16/07/2005, 00h01
  5. Réponses: 5
    Dernier message: 16/03/2005, 22h17

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