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 :

Recherche chaine dans un fichier


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 18
    Points : 14
    Points
    14
    Par défaut Recherche chaine dans un fichier
    Bonjour,

    J'ai un fichier qui contient plusieurs ligne ainsi :

    MARSEILLE;45646;fzefze
    MARSEILLE;456hrt;gergt
    TOULOUSE;4g5er6;45g6er
    PARIS;fez45f6ze;456fez456
    PARIS;fez56f456;456fze56

    Je voudrais n'afficher que les lignes qui se répète celon le nom de la ville. C'est a dire dans cet exemple Marseille et Paris mais pas toulouse.

    Donc le début, j'ai pensé a déjà isoler le nom de la ville ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $fichier = "c:\\temp\\test.txt";
    open (FIC, "<$fichier) or print "fichier introuvable";
    while (<FIC>) {
    chomp;
    ($ville, $truc, $machin) = split (/;/, $_);
    }
    Mais c'est aprés que je ne sais pas comment faire pour dire d'afficher la ligne uniquement si le nom de la ville apparait sur une autre ligne dans le fichier.

  2. #2
    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
    Il faut ruser . Tu peux lire le fichier 2 fois.
    Une première fois pour compter tes villes et une deuxième fois pour l'affichage des lignes souhaitées du fichier.

    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/perl
    use warnings;
    use strict;
     
    my $fichier = "test.txt";
    open( FIC, '<', $fichier ) or die "Fichier introuvable : $fichier\n";
     
    # Compteur ville
    my %CompteurVilles;
    while (<FIC>) {
      chomp;
      my ( $ville, undef, undef ) = split(/;/);
      $CompteurVilles{$ville}++;
    }
    close(FIC);
     
    # Affichage
    open( FIC, '<', $fichier ) or die "Fichier introuvable : $fichier\n";
    while ( my $ligne = <FIC> ) {
      chomp $ligne;
      my ( $ville, undef, undef ) = split( /;/, $ligne );
      if ( $CompteurVilles{$ville} > 1 ) {
        print "$ligne\n";
      }
    }
     
    close(FIC);

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Il n'est pas nécessaire de lire le fichier 2x.
    Lorsqu'une ville apparait plusieurs fois (2x ou plus), laquelle souhaites-tu faire apparaitre, la première, la dernière, une autre ?

    Si c'est, comme dans l'exemple de djibril, la première occurrence, voici un exemple d'algorithme :

    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
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    my $fichier = "test.txt";
    open( my $FIC, '<', $fichier ) or die "Fichier introuvable : $fichier: $!\n";
     
    # Compteur ville
    my %Villes;
    while (<$FIC>) {
      my ( $ville ) = split(/;/);
      if (exists $Villes{$ville}) {
        # La ville existe déjà
        if (defined $Villes{$ville}) {
          # La ville n'a pas encore été affichée
          print $Villes{$ville};
          # Indiquer que la ville a été affichée en indéfinissant cette ligne
          $Villes{$ville} = undef;
        }
      }
      else {
        # La ville n'existe pas, on l'ajoute à la liste des lignes de villes
        $Villes{$ville} = $_;
      }
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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
    Je pense qu'il voulait afficher toutes les lignes si nbr ville > 1.
    J'ai lu le fichier 2 fois pour éviter le stockage en mémoire et de plus, je n'avais pas envie de réfléchir à l'algo

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Merci.

    La solution de djibril marche à merveille !

    Merci merci merci.

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

Discussions similaires

  1. Rechercher une chaine dans un fichier
    Par bigey3 dans le forum Langage
    Réponses: 12
    Dernier message: 30/05/2008, 16h35
  2. Rechercher une chaine dans un fichier Excel
    Par matcram dans le forum ASP
    Réponses: 1
    Dernier message: 03/10/2007, 21h59
  3. [code]Recherche d'une chaine dans des fichiers
    Par guillaume_pays_ceven dans le forum Contribuez
    Réponses: 5
    Dernier message: 21/06/2007, 14h32
  4. Recherche chaine dans un fichier
    Par matt8-5 dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2006, 16h07
  5. rechercher et extraire deux chaines dans un fichier
    Par piotr dans le forum Langage
    Réponses: 16
    Dernier message: 13/07/2006, 15h07

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