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 deux fichiers simultanément


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2007
    Messages : 148
    Points : 83
    Points
    83
    Par défaut Lire deux fichiers simultanément
    Bonsoir,

    Je vous expose mon problème:

    Je veux consulter deux fichiers en même temps, c'est-à-dire chercher une information sur deux fichiers simultanément, voici un exemple:

    Fichier1:

    16/11/08;nom1
    16/11/08;nom2
    16/11/08;nom3
    16/11/08;nom4
    16/11/08;nom5

    Fichier2:

    16/11/08;nom1
    16/11/08;nom1
    16/11/08;nom1
    16/11/08;nom2
    16/11/08;nom3

    Je veux calculer le nombre de fois qu'une même information qui se trouve dans le fichier1 se répète dans le fichier2, avec l'exemple c'est plus clair, lol :

    Voici le résultat recherché :

    Output:

    16/11/08;nom1;3
    16/11/08;nom2;1
    16/11/08;nom3;1
    16/11/08;nom4;0
    16/11/08;nom5;0

    Ci-dessous mon code :
    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
     
    #!/usr/bin/perl   
    {  
    open(IN,"<Fichier1.csv");
    open(IN1,"<Fichier2.csv");
    open(OUT,">>Output.csv");
     
    while(<IN>)
    {
    @ligne=split(/;/,$_);
    $var=$ligne[1];
    $i=0;
    while(<IN1>)
    {
    @ligne1=split(/;/,$_);
    $var1=$ligne1[1];
    if ($var eq $var1)
    {
    $i=$i+1;
    }
    }
    $output=$ligne[0].";".$ligne[1].";".$i;
    print OUT ("$var\n");
    }
    close IN;
    close IN1;
    close OUT;
    }
    Le résultat n'est pas celui escompté, je crois que le problème réside dans le fait que j'ai utilisé deux fois "$_", du coup le programme ne s'est plus sur quel fichier travailler ?! Je ne vois pas comment lire des lignes de deux fichiers différents simultanément.

    Toute proposition est la bienvenue .

    Salutations.

  2. #2
    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
    Si tu n'as pas un très grand nombre d'enregistrement dans ton index, ton problème se résout aisément avec une table associative (hash) chargée en mémoire. Tu n'as pas besoin de lire les fichiers d'entrée simultanément.

    En gros, tu procèdes comme suit:
    1. charge les lignes signifiantes de ton fichier d'index dans un hash et ferme ce fichier
    2. lis le fichier à indexer et cumule le compte d'occurence dans ton hash
    3. imprime


    Voilà ce que ça donne (demande si tu ne comprends le code) :
    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
    #!/usr/bin/env perl -w
    use strict;
     
    my %count;
     
    open my $filehandler, '<', 'file1.csv'	
    	or die "$!\n";
    while (<$filehandler>) {
    	chomp;
    	next if not /;/;
    	$count{$_} = 0;
    }
    close $filehandler;	
     
     
    open $filehandler, '<', 'file2.csv'	
    	or die "$!\n";
    while (<$filehandler>) {
    	chomp;
    	$count{$_}++ if defined $count{$_};
    }
    close $filehandler;
     
    open $filehandler, '>', 'output.csv'	
    	or die "$!\n";
    print $filehandler map { "$_;$count{$_}\n" } sort keys %count;
    close $filehandler;
    Tu peux aussi n'extraire qu'une donnée (ton exemple retient les deux premiers champs) avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	my $data = (split /;/)[1];
    	next if not defined $data;
    	$count{$data} = 0;
    dans la boucle de lecture.

    Le tableau associatif ne conserve pas l'ordre. Si tu à besoin de l'ordre original, utilise un tableau de tableau à 2 éléments ou alors avec Tie::Hash::Indexed.

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2007
    Messages : 148
    Points : 83
    Points
    83
    Par défaut
    Salut Iblis,

    Je suis désolée pour mon retard de réponse .

    Je vous remercie pour votre post détaillé .

    J'ai repris exactement le code que vous avez posté, en l'exécutant, j'obtiens cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    No such file or directory
    Je tiens à préciser que je n'ai jamais utilisé les hash, c'est pour cette raison que j'ai un peu de mal à comprendre votre code surtout quand vous mettez :
    pour le fichier1, et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $count{$_}++ if defined $count{$_};
    pour le fichier2 ?

    Je vais essayer de me documenter sur les hash .

    Merci encore, salutations

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Hoopsy
    J'ai repris exactement le code que vous avez posté, en l'exécutant, j'obtiens cette erreur :
    Code :
    No such file or directory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open my $filehandler, '<', 'file1.csv'
    Tu dois indiquer le chemin vers file1.csv, si il n'est pas dans le même répertoire que ton script, tu dois indiquer son chemin complet depuis la racine.




    Un hash associe une clé à une valeur. Dans ce cas ci, la clé est la ligne lue et la valeur 0. Lors de la lecture du premier fichier, tu récupères toutes les lignes possibles et tu laisses les valeurs à 0.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $count{$_}++ if defined $count{$_};
    Lors de la lecture du second fichier, si la ligne lue existe dans le premier fichier, donc est définie dans %count, on ajoute 1 à la valeur associée à cette ligne dans ce hash.


    Ainsi donc, en fin de compte, %cont contient toutes les lignes du premier fichier ainsi que leur occurence dans le second fichier.



    Hash
    http://perl.developpez.com/faq/?page...nB4#sectionB41
    Fichier
    http://perl.developpez.com/faq/?page=sectionC1

  5. #5
    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
    Citation Envoyé par Hoopsy Voir le message
    J'ai repris exactement le code que vous avez posté, en l'exécutant, j'obtiens cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    No such file or directory
    Oui, bien sûr, c'est de ma faute, j'ai nommé vos fichiers file1.csv et file2.csv dans mon code au lieu de vos Fichier1.csv et Fichier2.csv.

    Un grand merci à Jasmine qui a été plus rapide à fournir une explication du code.

    Comme tu l'as certainement compris maintenant, un hash est un tableau associatif, dont chaque élement est composé d'un couple: la clé et la valeur. On accède aux valeurs par les clés, un peu comme un tableau à indice numérique, à ceci près 1) que les indices (les clés) peuvent ne pas être numériques 2) que la table associative n'a pas d'ordre.

    Si tu ne l'as pas fait, lis les parties consacrées aux structures de données et aux fichiers dans la FAQ. Cela te donnera les bases.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/09/2011, 16h13
  2. Lire deux fichiers en même temps
    Par forest.y dans le forum VBScript
    Réponses: 6
    Dernier message: 10/08/2011, 00h29
  3. Lire deux fichiers en même temps
    Par Carlozi dans le forum Langage
    Réponses: 23
    Dernier message: 31/07/2008, 12h19
  4. [DOM] Lire deux fichiers xml à la fois
    Par n_adou dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 12/06/2008, 21h33
  5. Réponses: 6
    Dernier message: 27/07/2006, 15h34

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