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 récupérer le contenu de plusieurs fichiers textes ?


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut Comment récupérer le contenu de plusieurs fichiers textes ?
    Bonjour,

    J'aurais besoin d'un peu d'aide pour résoudre un petit problème ! Cela ne fait que deux jours que je fais du Perl, donc il me manque des infos !

    Je voudrais à partir de fichiers textes (500 en tout) créer un autre fichier qui les regrouperait tous. Donc je voudrais insérer le contenu de tous les fichiers dans un seul et par la même occasion y insérer des sortes de balises XML (ça je sais le faire avec les expressions régulières).

    Actuellement mon problème est que j'arrive à ouvrir et lire ligne par ligne un seul fichier que j'ai mis en argument dans le Std Input de Perl Express. Je sais aussi ouvrir un répertoire et imprimer la liste des fichiers qu'il contient. Mais je n'arrive pas à faire un mixage de tout ça !

    J'espère être claire dans ce que je vous ai expliqué et que quelqu'un pourra me venir en aide !

    Merci d'avance

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    Hello,

    Voici comment lire un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #Ouverture du fichier
    open MONFIC, "<$fic" or die "Impossible de lire le fichier $fic\n";
    #Recupération du contenu
    my @contenu=<MONFIC>;
    #Fermeture du fichier
    close MONFIC;
    Voici maintenant comment lire le fichier ligne à ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #Ouverture d'une boucle
    foreach my $ligne (@contenu)
    {
        ....mon code....
    }
    Si tu as besoin d'infos supplémentaiers n'hésite pas...

    Bon courage.

    Manuxme.

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Salut

    Tout ceci est d'ailleurs dit dans la FAQ ainsi que dans mes cours.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut Oui mais je voudrais faire ça :
    Merci !

    Mais en fait je sais ouvrir et lire un fichier. Mais ce qui me pose problème c'est à l'intérieur d'un répertoire de lire tous les fichiers en même temps et d'y faire mes modifications.
    en fait voici mon code actuel :
    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
     
    use strict ;
     
    my $fichier = shift @ARGV ; # @ARGV contient la liste
    # des paramètres passés au programme.
    # Avec Perl Express, on fait ça dans
    # Std.input : choisir "Input Files"
    # et ajouter un fichier du corpus, par exemple.
    # 'shift' permet de 'dépiler', cad de sortir
    # de la liste la 1er valeur.
    # On aurait pu faire aussi :
    # my $fichier = $ARGV[0] ;
     
     
    # ON vérifie qu'il y a bien un fichier passé en paramètre :
    unless ($fichier){
    print "Il manque un nom de fichier !\n" ;
    print "Utilisation : afficheligne.pl fichier\n" ;
    exit ;
    }
     
    # On verifie que le fichier existe !
    unless (-f $fichier){
    print "Le fichier $fichier n'existe pas ! \n" ;
    exit ;
    }
     
    #On affiche le nom du fichier
    print "$fichier\n" ;
    print "-----------------------------\n" ;
     
    #On affecte à $balises_sup les nouvelles balises que l'on veut ajouter au texte
    #Note : On pourrait affecter toutes les balises d'un seul coup mais pour des
    #raisons de lisibilité du script on le fait en plusieurs fois à l'aide de
    #l'opérateur de concaténation .=
    my $balises_sup = "\n".'<ref>';
    $balises_sup.= '</ref>'."\n".'<cat>'."\n";
    $balises_sup.= '<theme>'.'</theme>'."\n".'<theme>'.'</theme>'."\n".'<psycho>'.'</psycho>'. "\n";
    $balises_sup.= '</cat>'."\n" ;
     
    #On ouvre le fichier, on le lit ligne à ligne
    open HF, "<$fichier" or die "Pb à l'ouverture du fichier $fichier" ;
    while (my $ligne = <HF>){
    #On fait une opération de substitution de la balise xml par la balise notice
    #On utilise les expressions régulières
    $ligne =~s/<xml>/<notice>/;
    $ligne =~s/<\/xml>/<\/notice>/;
    #Expression régulière qui dit d'ajouter la valeur de la variable scalaire
    #$balises_sup à la suite de la balise </acc>
    $ligne=~s/(<\/acc>)/$1 $balises_sup/ ;
    print "$ligne" ; # Pas besoin de \n ici : les lignes du fichier en on déjà !
    }
    close HF ;
    Mais ça ne fonctionne que pour un fichier transmis en paramètre. Moi je voudrais le faire automatiquement pour tous les fichier d'un seul coup.

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Manuxme
    Hello,

    Voici comment lire un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #Ouverture du fichier
    open MONFIC, "<$fic" or die "Impossible de lire le fichier $fic\n";
    #Recupération du contenu
    my @contenu=<MONFIC>;
    #Fermeture du fichier
    close MONFIC;
    Voici maintenant comment lire le fichier ligne à ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #Ouverture d'une boucle
    foreach my $ligne (@contenu)
    {
        ....mon code....
    }
    Si tu as besoin d'infos supplémentaiers n'hésite pas...

    Bon courage.

    Manuxme.
    Ce code n'est pas très bon : en effet tu charges l'intégralité du fichier en mémoire pour faire un traitement ligne à ligne par la suite, ce n'est pas cohérent...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #Ouverture du fichier
    open MONFIC, "<$fic" or die "Impossible de lire le fichier $fic\n";
    #Lecture ligne à ligne
    while( my $ligne = <MONFIC> ){
      # Traitement
    }
    #Fermeture du fichier
    close MONFIC;

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    Hello Jedai,

    Pourquoi dis que ce n'est pas cohérent ?
    Juste parce que je passe par un @ pour stocker le fichier.

    Peut il y avoir des différences (vitesse d'execution, résultat different ?) entre ce que tu proposes et ce que j'indique ?

    Merci de m'éclairer..

    Manuxme.

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ce que je fait et ce que tu fais est différent : toi tu charges l'intégralité du fichier dans un tableau, puis tu traites chacun des éléments du tableau.
    Moi je traite ligne à ligne en ne conservant jamais qu'une seule ligne en mémoire du point de vue de Perl.

    Imagine ce que donnera ta solution si tu essaies de lire un fichier de 1 Go ? La mienne sera toujours aussi rapide (et à peu près aussi rapide que la tienne pour n'importe quel cas, pour des questions de lecture bufferisée par exemple).

    Bien sûr dans la plupart des cas courants, tu ne verras pas la différence. Mais justement, si tu ne vois aucune différence dans les cas courants, et que cela rend ton code plus sûr et performant dans les situations exceptionnelles, il vaut mieux utiliser le code que je propose, non ?

    (pour ce qui est de la "cohérence" : charger l'intégralité du fichier en mémoire n'a d'intérêt que si on a besoin simultanément de données qui peuvent être à deux extrémités du fichier, pas si on va faire un traitement ligne à ligne)

    --
    Jedaï

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    Merci pour ces précision Jedi.
    Je vais pouvoir optimiser mon code pour les prochains scripts à venir.

    J'ai commencé le perl il y a quelque mois et suis très preneur de ce genre d'infos.

    Merci,

    Manuxme.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Bonjour à tous !

    Alors je vois qu'il y a de nouvelles infos, mais pas concernant mon message initial ! En tout cas merci Jedi et Manuxme pour leur infos précieuses.

    Mais, est-ce que quelqu'un sait résoudre mon problème initial ?

    Merci d'avance !

    Calimero2611

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu n'es pas assez précis sur ce que tu veux faire... Lire une ligne de chacun des fichiers est facile, mais tu ne précise pas combien tu as de fichier, si tu veux vraiment lire ligne par ligne tous ces fichiers simultanément, etc... A priori avec ce que tu dis au début, on peut se demander si tu ne cherches pas tout simplement à faire une pseudo-concaténation de tes fichiers, ce qui est différent.

    Tu sais déjà lire un fichier ligne à ligne, donc qu'est-ce qui te pose problème ?


    --
    Jedaï

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

Discussions similaires

  1. récupérer contenu de plusieurs fichiers texte en 1
    Par Darkware dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 09/06/2012, 23h11
  2. Réponses: 2
    Dernier message: 10/09/2007, 19h03
  3. [DEBUTANT] Comment récupérer le contenu d'une zone texte
    Par josémaria dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/02/2007, 01h24
  4. Réponses: 10
    Dernier message: 10/02/2007, 18h44
  5. Réponses: 3
    Dernier message: 19/05/2006, 11h35

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