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 :

rechercher et extraire deux chaines dans un fichier


Sujet :

Langage Perl

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 68
    Par défaut rechercher et extraire deux chaines dans un fichier
    Bonjour,

    J'ai un fichier, et je souhaiterais y rechercher deux chaines de caractères:
    Voici à quoi ressemble ce fichier:
    <tr>
    <td><font face="verdana,sans-serif" size=1>&nbsp;32997</td>
    <td>&nbsp;<a href="/search/?term=mot&mkt=fr&lang=fr_FR"><font face="verdana,sans-serif" size=1 color=#000000>tps</a></td>
    </tr>

    Je voudrais lire ce fichier et y récupérer deux valeurs si j'ai le bon mot:
    par exemple ici je veux récupérer "32997" et le terme "mot"

    j'avoue que je cale depuis pas mal de temps sur ce pb.
    Pour récupérer 32997, j'avais écrit le code suivant:

    open(FIC,'Web.html') ||die ("le fichier n'est pas présent\n");
    while(<FIC>)
    {
    $ligne = <FIC>;

    if($ligne=~/<tr(.*)nbsp;(.*?)</)
    {
    $nombre= $1;
    print $nombre;
    }
    }

    mais ça ne marche pas!! alors je suis mal parti pour lire les deux chaines qui m'intéresse!!

    qui a une idée?

    Merci

  2. #2
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Bon, pour commener :



    Ensuite, pour en venir à ton code, ton $1 va te renvoyer, dans le meilleur des cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <tr>
    <td><font face="verdana,sans-serif" size=1>&nbsp;32997</td>
    Mais ca supposerait que des 2 lignes n'en forment qu'une seule, ce qui n'est pas le cas ici...

    La regexp à utiliser est:

    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
    open(FIC,'Web.html') ||die ("le fichier n'est pas présent\n");
    while(<FIC>)
    {
    $ligne = <FIC>;
    
      if ($ligne =~ /nbsp;(\d*?)</ )
      {
        $nombre= $1;
      }
      elsif ($line =~ /?term=(.+)&/ )
      {
        $mot = $1
        if ($mot eq 'lebonmot') { print $nombre; }
      }
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 68
    Par défaut
    merci pour ta réponse rapide
    j'ai essayé ton code mais j'ai l'erreur suivante:


    Quantifier follows nothing in regex; marked by <-- HERE in m/? <-- HERE term=(.+)&/ at stat1.pl line 13.

  4. #4
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    oups, effectivement j'ai une erreur de code, je l'ai résolue en partie, mais ca ne fonctionne pas encore pour le mot... au moins ca trouve le nombre pour l'instant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    open(FIC, $ARGV[0]) ||die ("le fichier n'est pas pr‚sent\n");
    while(<FIC>)
    {
    	$ligne = <FIC>;
     
    	if ($ligne =~ /nbsp;(\d*?)</ )
    	{
    		$nombre= $1;
    		print("nombre : $nombre\n");
    	}
     
    }

  5. #5
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par MarneusCalgarXP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if ($ligne =~ /nbsp;(\d*?)</ )
    
      elsif ($line =~ /?term=(.+)&/ )
    La façon de récupérer le nombre n'est pas optimale, la seconde regex est erronée, j'emploierais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if ($ligne =~ /nbsp;(\d*)</ )
    
      elsif ($line =~ /\?term=([^&]*)&/ )
    --
    Jedaï

  6. #6
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Citation Envoyé par Jedai
    La façon de récupérer le nombre n'est pas optimale, la seconde regex est erronée, j'emploierais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if ($ligne =~ /nbsp;(\d*)</ )
    
      elsif ($line =~ /\?term=([^&]*)&/ )
    Etonnemment la 2° regexp ne match jamais rien sur mon ordi sous Windows, perl ActiveState 5.8.7

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 68
    Par défaut
    Merci pour votre aide,
    en fait dans chaque ligne de mon fichier, le mot apparait: soit seul et le nombre correspondant m'interesse, soit accompagné d'autre mots et dans ce cas, je ne veux plus le nombre associé.
    comment s'arrêter quand j'ai trouvé le bon mot et lui tout seul?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 68
    Par défaut
    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
    open(FIC,'Web.html') ||die ("le fichier n'est pas présent\n");
     
    while(<FIC>)
    {
     
     $ligne = <FIC>;
     
    	if ($ligne =~ /nbsp;(\d*)</ )
    	{
    		$nombre= $1;
    		print("nombre : $nombre\n");
    	}
     
    	elsif ($ligne =~ /\?term=([^&]+)&/ )
    	{
    		$mot = $1;
    		print("mot : $mot\n");
    		if ($mot eq 'lebonmot') { print $nombre; }
    	}
    }

    pour l'instant ça m'affiche
    nombre : 32997
    nombre : 8352
    nombre : 7589
    nombre : 6139
    nombre : 3867
    nombre : 3375
    nombre : 2010
    nombre : 1932
    nombre : 1776
    nombre : 1457
    nombre : 1247
    nombre : 1055
    nombre : 1006
    nombre : 858
    nombre : 742
    nombre : 738
    nombre : 720

  9. #9
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par MarneusCalgarXP
    Etonnemment la 2° regexp ne match jamais rien sur mon ordi sous Windows, perl ActiveState 5.8.7
    Et pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >perl -e "print q(/search/?term=mot&mkt=fr&lang=fr_FR) =~ /\?term=([^&]*)&/"
    mot
    --
    Jedaï

  10. #10
    Expert confirmé
    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
    Par défaut
    Déjà essaie comme ça :
    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
    open(FIC,'Web.html') ||die ("le fichier n'est pas présent\n");
     
    while(my $ligne = <FIC>)
    {
     
    	if ($ligne =~ /nbsp;(\d+)</ )
    	{
    		$nombre= $1;
    		print("nombre : $nombre\n");
    	}
     
    	if ($ligne =~ /\?term=([^&]*)&/ )
    	{
    		$mot = $1;
    		print("mot : $mot\n");
    		if ($mot eq 'lebonmot') { print $nombre; }
    	}
    }
    Parce que là tu saute une ligne sur deux... En effet tu lis une ligne dans la condition de ta boucle (elle se retrouve dans $_) puis tu lis la ligne suivante que tu mets dans $ligne, donc tu ne traite que les lignes de numéro pair !

    --
    Jedaï

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 68
    Par défaut
    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
    while(<FIC>)
    {
    
    $ligne = <FIC>;
    print $ligne;
    
     	if ($ligne =~ /nbsp;(\d*)</ )
    	{
    		$nombre= $1;
    		print("nombre : $nombre\n");
    	}
      
    	if ($ligne =~ /\?term=([^&]+)&/ )
    	{
    		$mot = $1;
    		print("mot : $mot\n");
    		if ($mot eq 'lebonmot') { print $nombre; }
    	}
    }
    en mettant un print en dessous de $ligne=<FIC>

    je constate que ma ligne n'est pas complète:
    </tr>
    <td><font face="verdana,sans-serif" size=1>&nbsp;1932</td>
    nombre : 1932

    le reste est apparemment ignoré

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 68
    Par défaut
    ça marche!!
    j'ai la sortie suivante
    mot : lebonmot
    nombre : 32997
    nombre :
    mot : autremot%20lebonmot
    nombre : 8645
    nombre :
    etc...

  13. #13
    Expert confirmé
    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
    Par défaut
    Vu ta sortie, il vaudrait mieux utiliser \d+ à la place de \d*...

    --
    Jedaï

  14. #14
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Citation Envoyé par piotr
    ça marche!!
    j'ai la sortie suivante
    mot : lebonmot
    nombre : 32997
    nombre :
    mot : autremot%20lebonmot
    nombre : 8645
    nombre :
    etc...
    Cool ! comment as-u fait ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 68
    Par défaut
    Merci les gars pour votre aide, je n'ai pas hélas votre niveau mais je ne désespère pas!

    Voici 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
    open(FIC,'Web.html') ||die ("le fichier n'est pas présent\n");
     
    while(my $ligne = <FIC> )
    {
    	if ($ligne =~ /nbsp;(\d+)</ )
    	{
    		$nombre= $1;
    	}
     
    	elsif ($ligne =~ /\?term=([^&]*)&/ )
    	{
    		$mot = $1;
    		@tab = split(/%20/,$mot);
    		if (@tab ==1) 
                                 {print ("mot : $mot\n");
    		     print ("nombre : $nombre\n");
    				die }
    	}
    }
    ainsi le code extrait le mot qui m'intéresse et lui seul avec le nombre associé.

    Dans ma requête sur "lebonmot", cela génère une page Web qui contient ce bon mot tout seul avec un nombre associé. Dans web.html, il y a aussi d'autres mots associés et contenant "lebonmot"
    (sous la forme mot1%20mot2%20lebonmot)
    , aussi c'est pourquoi je sais que lorsque @tab vaut 1 j'ai automatiquement ce que je cherche.
    Je travaille sous XP.
    Par contre ma sortie de boucle n'est peut être pas très élégante qu'en pensez-vous?

  16. #16
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Par contre ma sortie de boucle n'est peut être pas très élégante qu'en pensez-vous?
    Il est vrai qu'un last serait plus élégant ! die sert à tuer le script en signalant une erreur, à la limite exit sert à tuer le script en signalant une sortie correcte, mais last amène simplement à la fin de la boucle

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 68
    Par défaut
    je ne connaissais pas l'instruction: merci!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/11/2008, 21h46
  2. Rechercher une chaine dans un fichier
    Par bigey3 dans le forum Langage
    Réponses: 12
    Dernier message: 30/05/2008, 16h35
  3. Rechercher une chaine dans un fichier Excel
    Par matcram dans le forum ASP
    Réponses: 1
    Dernier message: 03/10/2007, 21h59
  4. [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
  5. Recherche chaine dans un fichier
    Par matt8-5 dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2006, 16h07

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