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 :

Lire plusieurs fichier à la suite


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Points : 23
    Points
    23
    Par défaut Lire plusieurs fichier à la suite
    Bonjour,

    Je dispose de plusieurs fichier. Je dispose de mon code que j'aimerai effectuer sur tous les fichier en même temps. Ceci étant dit j'aimerai que mon code s'execute sur l'ensemble des fichiers.

    Je m'explique. Si par exemple j'ai "fichier.txt" qui dispose de 3 mots et que j'ai "fichier 2.txt" qui dispose de 5 mots et que mon code compte les nombres de mots, j'aimerai que mon code passe par les deux fichier pour me dire qu'il y a 8 mots dans l'ensemble de mes fichiers (et non dire 3 dans le premier et 5 dans le deuxieme).

    En fait j'aimerai qu il lise plusieurs fichiers exactement de la même facon que si ca n'était que un fichier.

    En esperant avoir été clair...

    Merci d'avance et à bientot!

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2003
    Messages : 1 584
    Points : 2 032
    Points
    2 032
    Par défaut
    Bonjour.

    Eh bien c'est fort simple ton affaire et je te propose une solution rapide à mettre en place : tu places en tant que fonction toute la partie de ton code qui ouvre un fichier et compte les mots qu'il y trouve.

    C'est tout simple : la fonction reçoit comme argument le nom du fichier (ou bien le chemin d'accès au fichier + son nom si le fichier ne se trouve pas au même endroit que ton script) et elle te retourne un scalaire contenant le nombre de mots lus dans le fichier.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    Bonjour Arioch,

    Mon code fais déjà cela.

    Ce que je veux c'est faire la même chose avec plusieurs fichiers mais comme si ca n'était qu un fichier (cf mon post précédent)

    Si je ne suis pas clair dans ma question n'hésitez pas à me le dire!

    A bientot!

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    bah ecoute, ce que je comprends, c'est que tu peux te faire une fonction ( procedure) qui comptabilise le nombre de mot dans un fichier. tu l'appliques sur chaque fichier et met la valeur dans une variable qui s'increment.
    Donc si fichier 1 => 3 mot, fichier 2 => 5 mot => bah c'est juste une question d'addition.

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2003
    Messages : 1 584
    Points : 2 032
    Points
    2 032
    Par défaut
    Citation Envoyé par ecthelion
    Bonjour Arioch,

    Mon code fais déjà cela.

    Ce que je veux c'est faire la même chose avec plusieurs fichiers mais comme si ca n'était qu un fichier (cf mon post précédent)

    Si je ne suis pas clair dans ma question n'hésitez pas à me le dire!

    A bientot!
    Tu seras quand même obligé d'ouvrir chacun des fichiers pour en compter les mots, autant donc fonctionnaliser tout ton bloc de code qui ouvre et lit un fichier pour en compter les mots.

    Montre nous ton code, qu'on te le fonctionnalise.

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    Laissez tomber l'exemple du nombre de mot. C'est pas du tout ce que je fais mais c'était un exemple pour vous expliquer le principe de ce que je veux faire.

    Mon code est deja dans une fonction et j'appelle deja cette fonction avec le chemin de mon fichier.

    Ce que je veux c appeler deux fichiers (ou plus) l'un apres l'autre comme si ils ces deux fichiers n'était qu un seul fichier.

    Je vais donner un autre exemple qui sera plus clair

    On a deux fichiers:


    Fichier1.txt

    "Bonjour Monsieur et Madame"

    Fichier2.txt

    "Bonjour Madame Machin"

    J'ai un code (encore un exemple pour expliquer!!) qui compte le nombre de mots differents dans un fichier.

    Dans "fichier1.txt" il retourne donc 4 et dans "fichier2.txt" il retourne 3

    Ce que je veux faire c qu'il fasse comme si les deux fichiers n'étaient qu un seul fichier et retourner un nombre de mots différents égal à 5 dans mon cas précis puisque Bonjour et Madame sont présents dans chaque fichier.

    Ce que je veux c une solution générique qui marcherait quelque soit le code que je veux executer.

    Merci d'avance!

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2003
    Messages : 1 584
    Points : 2 032
    Points
    2 032
    Par défaut
    Techniquement, tu ne peux pas ouvrir plus d'un fichier par un seul appel à la fonction open.

    Sous un système Unix/Linux, via la commande 'cat', tu pourrais faire afficher les fichiers que tu veux et les retourner dans un tableau ou une variable de type scalaire et là, faire en un seul traitement ce que tu veux.

    Et qu'est-ce qui te chagrine dans le fait d'avoir à ouvrir plusieurs fichiers ? D'autant plus que tu peux trés bien, via ta fonction justement, lui envoyer tous les fichiers que tu veux, comme par exemple :

    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
    Ma_Chtite_Fonction_A_Moi("fichier1", "fichier2", "fichier3");
     
    sub Ma_Chtite_Fonction_A_Moi
    {
        my @fichier = @_;
     
        foreach my $fic(@fichier)
        {
            open(FIC, $fic) or warn ("attention fichier $fic non ouvert : $!\n");
            while(<FIC>)
            {
                # tu fais ce que tu dois faire ici
            }
            close(FIC);
        }
    return;
    }

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    En tout cas, c'est toujours pas clair pour moi.
    Donc ce que tu peux faire, c'est de creer un fichier temporaire qui sera la concatenation de tous tes fichiers à traiter. et ensuite, tu travailles directement sur ce fichier temporaire que tu pourra supprimer en fin de script.
    Voilà

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 53
    Points : 23
    Points
    23
    Par défaut
    Oui ca serait la concatenation de mes fichiers. Le probleme c'est que mes fichiers sont tous très gros (une vingtaine d'une moyenne de 500 megas). Est ce que ca serait un probleme?

    Puis -je donc tous les ouvrir en même temps et executer mon code comme pour un seul fichier?

    Si c le cas c plutot cool!!!

    Merci!!

  10. #10
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2003
    Messages : 1 584
    Points : 2 032
    Points
    2 032
    Par défaut
    Citation Envoyé par ecthelion
    Oui ca serait la concatenation de mes fichiers. Le probleme c'est que mes fichiers sont tous très gros (une vingtaine d'une moyenne de 500 megas). Est ce que ca serait un probleme?
    Concaténer tous tes fichiers revient à dire les ouvrir un par un, copier tout leur contenu dans un fichier annexe ET ENSUITE se mettre à bosser pour de bon via ce nouveau fichier annexe.

    Ca fait faire des manips supplémentaires à ton programme et attention à l'espace disponible car si tu as 20 fichiers faisant chacun 500 Mo, ca te fait créer au final un fichier unique d'environ 10 Go. As-tu la place pour ?

    Citation Envoyé par ecthelion
    Puis -je donc tous les ouvrir en même temps et executer mon code comme pour un seul fichier?

    Si c le cas c plutot cool!!!

    Merci!!
    A moins que l'expert Jedai ne sorte une botte secrète de son jeu , tu ne peux ouvrir tous tes fichiers en même temps (ou bien en utilisant fork( ) pour avoir plusieurs process qui bossent en même temps mais est-ce bien utile ici ?).

    Par contre, l'exemple que je t'ai montré te permet, fichier par fichier, de bosser sur ce dont tu as besoin. Il te suffit juste d'envoyer tous tes fichiers à la fonction et elle fait sa soupe ensuite toute seule.

    Ceci dit, fork peut aussi être la solution mais je me demande quelles ressources ça prend si tu comptes faire un processus fils pour chacun de tes 20 fichiers, au vu de leur poids (500 Mo) !

  11. #11
    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
    Et bien sans voir ton code je ne suis pas persuadé que ce que tu proposes soit vraiment la bonne solution... Néanmoins c'est possible, il suffit de créer un objet qui se comporte comme un Filehandle mais en réalité travaille en sous main sur une liste de fichier, en fait c'est tellement possible que ça a déjà été fait :
    File::LinearRaid.

    --
    Jedaï

  12. #12
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Bonsoir.

    Sans vouloir court-circuiter les experts, je me permets une remarque de grand débutant. A supposer que vous ayez moins de 10 fichiers à traiter, n'est-il pas possible de laisser perl les ouvrir et les lire l'un après l'autre en les passant en argument sur la ligne de commande ?

    C'est très certainement un peu naïf mais en reprenant votre exemple fictif le script qui suit semble fonctionner.

    i-blis:~ ofya$ echo "bonjour madame machin" > fichier1
    i-blis:~ ofya$ echo "bonjour madame et monsieur" > fichier2
    i-blis:~ ofya$ ./script.pl fichier1 fichier2
    5 (bonjour madame machin et monsieur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/perl
     
    use warnings;
    use strict;
     
    my @liste;
    while (<>) {
        chomp ($_);
        for my $mot (split ( /\s+/, $_)) {
             push (@liste, $mot)  unless (grep (/$mot/, @liste))
        }
    }
    print scalar(@liste)." (@liste)\n";
    Ce n'est bien sûr pas une vraie réponse. Et au fond rien de plus, mais en laissant perl tout faire, que ce que Arioch a proposé avec Sa_Chtite_Fonction_A_Lui.

    -----
    Une à une les gouttes érodent la montagne, proverbe ouzbek (Tomchi tosh teshadi)

  13. #13
    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
    Certes la fonction d'Arioch peut-être réécrite ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sub lire_fichiers {
      my $sub = shift;
      local @ARGV = @_;
      while( <> ){
        $sub->();
      }
    }
     
    lire_fichiers( sub { print }, qw(fichier1 fichier2 fichier3) );
    Mais ça ne semble pas être ce que souhaite le posteur initial (bien que pourquoi il veuille faire ce qu'il a demandé soit encore obscur).

    --
    Jedaï

Discussions similaires

  1. [Débutant] faire une boucle pour lire plusieurs fichiers à la suite
    Par hittie dans le forum MATLAB
    Réponses: 6
    Dernier message: 30/12/2011, 13h39
  2. Réponses: 2
    Dernier message: 27/04/2007, 13h45
  3. [Débutant] Lire plusieurs fichiers txt dans un répertoire
    Par leneuf dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/10/2006, 12h39
  4. Réponses: 6
    Dernier message: 28/09/2006, 18h58

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