Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1399 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Extraction d'une chaine

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Extraction d'une chaine

n°1197378
jerph
Posté le 12-09-2005 à 09:34:04  profilanswer
 

Bonjour à tous !
 
Voila, je cherche a extraire une chaine de caractères dans un fichier. (nombre d'annonce d'un site)
 
Extrait de mon fichier qui est en html :
 
                        <div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6B">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui  
                          : <span class="NbAnnonces02"><font color="#2E2C6B">6 541</font></span>&nbsp;annonces</font></div>
                        <br>
 
dans ce cas je souhaite extraire le chiffre 6 541
 
J'en appelle à vos pouvoirs car j'y arrive pas, je liste bien mon fichier mais après :pt1cable:  
 
merci

mood
Publicité
Posté le 12-09-2005 à 09:34:04  profilanswer
 

n°1197381
0x90
Posté le 12-09-2005 à 09:40:41  profilanswer
 


grep NbAnnonces02 fichier.html | sed -re 's/.*>([0-9 ]+)<.*/\1/'


 
 
[edit]
Merde c'est du perl :/ bon je passe ... mais la regexp devrait être bonne aussi


Message édité par 0x90 le 12-09-2005 à 09:41:15

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1197393
Elmoricq
Modérateur
Posté le 12-09-2005 à 10:01:34  profilanswer
 

La regexp est presque identique, oui, dans la second partie du s/// il faut remplacer 1 par $1 pour que ça fonctionne en PERL.

n°1197409
jerph
Posté le 12-09-2005 à 10:13:39  profilanswer
 

Merci pour vos réponses rapides !
 
Excuser mon ignorance mais comment faut-il s'en servir ? J'avais commencé par ouvrir le fichier, essayé de trouvé la chaine, puis fermer mon fichier.
 
Ce code fait-il tout ça ?
 

Code :
  1. grep NbAnnonces02 fichier.html | sed -re 's/.*>([0-9 ]+)<.*/$1/'


 
J'ai essayé mais j'obtiens ca :
 
String found where operator expected at C:\wget\test2.pl line 2, near "re 's/.*>
([0-9 ]+)<.*/$1/'"
        (Do you need to predeclare re?)
Not enough arguments for index at C:\wget\test2.pl line 2, near "index."
syntax error at C:\wget\test2.pl line 2, near "re 's/.*>([0-9 ]+)<.*/$1/'"
Execution of C:\wget\test2.pl aborted due to compilation errors.
 
merci encore

n°1197411
0x90
Posté le 12-09-2005 à 10:14:58  profilanswer
 

C'est pas du perl que je t'ai passé, c'est une commande bash sous nux, te faudra chercher un peu plus et connaitre le perl pour arriver à tes fins.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1197416
Elmoricq
Modérateur
Posté le 12-09-2005 à 10:16:45  profilanswer
 

Non, il t'a donné une commande shell, il avait mal lu l'énoncé (il l'a dit).
 
Pour utiliser des regexp :
http://perldoc.perl.org/perlre.html
 
Et pour une réponse plus précise, il va te falloir poster le morceau ad hoc de ton code, là comme ça je ne vois pas comment t'aider.


Message édité par Elmoricq le 12-09-2005 à 10:17:19
n°1197429
jerph
Posté le 12-09-2005 à 10:25:29  profilanswer
 

Elmoricq a écrit :

Non, il t'a donné une commande shell, il avait mal lu l'énoncé (il l'a dit).
 
Pour utiliser des regexp :
http://perldoc.perl.org/perlre.html
 
Et pour une réponse plus précise, il va te falloir poster le morceau ad hoc de ton code, là comme ça je ne vois pas comment t'aider.


 
merci, j'y jette un oeil. Pour préciser mon idée, je récupère un fichier index.html qui vient d'un site web. Dans ce fichier se trouve l'information (nombre d'annonce) que je souhaite extraire.
 
Cette extraction doit se faire dans cette partie :
 
<div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6B">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui  
                          : <span class="NbAnnonces02"><font color="#2E2C6B">6 541</font></span>&nbsp;annonces</font></div>  
                        <br>  
 

 
dans ce cas je souhaite extraire le chiffre 6 541  
 
J'ai commencé mon script perl en ouvrant le fichier "index.html" mais la ou je bloque c'est dans la recherche de ce "nombre d'annonce"
 
Tu comprends mon besoin ?  
 
merci

n°1197435
Elmoricq
Modérateur
Posté le 12-09-2005 à 10:29:58  profilanswer
 

Montre ton code.

n°1197441
jerph
Posté le 12-09-2005 à 10:35:14  profilanswer
 

Elmoricq a écrit :

Montre ton code.


Code :
  1. #!c:\perl\perl.exe
  2. open (fichier,"index.html" );
  3. while (my $ligne =<fichier> ){
  4.   if ($ligne =  #je cherche le nombre d'annonce
  5.     print $ligne;
  6. }
  7. close fichier;


 
ca va t'aider  :(

n°1197459
Elmoricq
Modérateur
Posté le 12-09-2005 à 10:58:04  profilanswer
 

jerph a écrit :

ca va t'aider  :(


 
Oui, c'est bien plus facile pour te montrer comment ça marche :
 

Code :
  1. #!c:\perl\perl.exe
  2. use strict;
  3. # Convention : les identifiants de fichier sont en majuscule
  4. open (FICHIER,"index.html" )
  5.     or die "Echec ouverture de 'index.html' : $!";
  6. foreach my $ligne ( <FICHIER> )
  7. {
  8.     chomp $ligne;
  9.     # petite amélioration de la regexp pour ne pas prendre les
  10.     # balises qui ne comportent qu'un espace, sans chiffre
  11.     print "$ligne\\n" if ( $ligne =~ s/.*>(\\d+\\s*\\d+)<.*/$1/ );
  12. }
  13. close FICHIER;


Message édité par Elmoricq le 12-09-2005 à 11:04:47
mood
Publicité
Posté le 12-09-2005 à 10:58:04  profilanswer
 

n°1197500
jerph
Posté le 12-09-2005 à 12:00:37  profilanswer
 

merci Elmoricq
 
ton script fonctionne sur le bout de code que tu avais mais y'a quelquechose qui ne correspond pas aux lignes d'origine car sur mon fichier index.html ca ne marche pas. Peut-être que ca vient de ma façon d'avoir poster ce morceau dans le forum :
 
je recommence différemment :
 

Code :
  1. <div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6B">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui
  2.                           : <span class="NbAnnonces02"><font color="#2E2C6B">6 541</font></span>&nbsp;annonces</font></div>
  3.                         <br>


 
Pour ma culture, peux-tu m'expliquer ta regexp  
 
merci encore

n°1197504
Elmoricq
Modérateur
Posté le 12-09-2005 à 12:09:46  profilanswer
 

jerph a écrit :

je recommence différemment :


 
Ca marche pareil. [:spamafote]
 

jerph a écrit :

Pour ma culture, peux-tu m'expliquer ta regexp


 
Le souci est que cette expression régulière fait appel à plusieurs notions qu'il serait assez long à expliquer ici, notament sur la "gourmandise" du moteur de regexp.
 
Je t'encourage à lire la documentation que je t'ai donnée en lien, si tu veux vraiment comprendre en profondeur comment ça fonctionne.
 
Sinon, en gros, ça ne conserve dans une ligne que le pattern décrit entre parenthèses de la regexp.  
Et ce pattern cherche la première occurence dans la ligne de : "au moins (+) un chiffre (\d), suivi de 0 ou plus (*) d'espaces (\s), suivis d'au moins (+) un chiffre (\d), le tout compris entre des caractères '>' et '<' ".


Message édité par Elmoricq le 12-09-2005 à 12:11:34
n°1197619
jerph
Posté le 12-09-2005 à 14:50:40  profilanswer
 

Merci pour tes explications c'est plus claire.
 
J'ai toujours le soucis avec le fichier brut html.
 
J'ai rajouté un  

Code :
  1. print $ligne;


 
et voici ce qu'il affiche :
 

Code :
  1. </table>                        <div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6
  2. B">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui                           : <span class="NbAnnonces0
  3. 2"><font color="#2E2C6B">6á053</font></span>&nbsp;annonces</font></div>                        <br>


 
 
ce ne serait pas un espace mais un á
j'ai donc essayé de modifier la regexp  en remplaçant s par w
 

Code :
  1. print "$ligne\n" if ( $ligne =~ s/.*>(\d+\w*\d+)<.*/$1/ );


 
mais pas mieux ...


Message édité par jerph le 12-09-2005 à 15:06:32
n°1197625
Elmoricq
Modérateur
Posté le 12-09-2005 à 14:53:19  profilanswer
 

Bizarre ce caractère. Essaie de remplacer "\w*" par "." (un point, tout seul, tout bête).

n°1197672
jerph
Posté le 12-09-2005 à 15:16:17  profilanswer
 

rien de neuf :
 
j'ai essayé ça :
 

Code :
  1. use strict;
  2. # Convention : les identifiants de fichier sont en majuscule
  3. open (FICHIER,"index.html" )
  4.     or die "Echec ouverture de 'index.html' : $!";
  5. foreach my $ligne ( <FICHIER> )
  6. {
  7.     chomp $ligne;
  8. print "$ligne/ligne\n";
  9.     # petite amélioration de la regexp pour ne pas prendre les
  10.     # balises qui ne comportent qu'un espace, sans chiffre
  11.    print "$ligne\n" if ( $ligne =~ s/.*>(\d+\.\d+)<.*/$1/ );
  12. }
  13. close FICHIER;


 
ce qui me permet de voir ce qui est considéré comme ligne.
 
résultat :
 

Code :
  1. <div class="NbAnnonces" style="padding-top:10px;"> <font color="#2E2C6B">&nbsp;&nbsp;&nbsp;
  2. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aujourd'hui /ligne
  3.                           : <span class="NbAnnonces02"><font color="#2E2C6B">6á053</font></span>&nbsp;annonces</fon
  4. t></div>/ligne
  5.                         <br>/ligne


 
j'en déduit que la recherche est effective sur :
 

Code :
  1. : <span class="NbAnnonces02"><font color="#2E2C6B">6á053</font></span>&nbsp;annonces</fon
  2. t></div>


 
 
J'ai essayé ca aussi, avec \w+ il devrait me trouver 6á053 non ? :
 

Code :
  1. print "$ligne\n" if ( $ligne =~ s/.*>(\w+)<.*/$1/ );


 
merci encore


Message édité par jerph le 12-09-2005 à 15:20:20
n°1197797
jerph
Posté le 12-09-2005 à 17:16:48  profilanswer
 

bon du nouveau :
 
avec ca :  
 
if ( $ligne =~ s/.*>(\d+\W\d+)<.*/$1/ )  
 
j'affiche :
 
6á053
 
maintenant j'essai de supprimer le caractére "á" dans la chaine  :pt1cable:

n°1197802
Elmoricq
Modérateur
Posté le 12-09-2005 à 17:29:12  profilanswer
 

if ( $ligne =~ s/.*>(\\d+)\\W(\\d+)<.*/$1$2/ )  


Message édité par Elmoricq le 12-09-2005 à 17:30:10
n°1197812
jerph
Posté le 12-09-2005 à 17:36:59  profilanswer
 

Elmoricq a écrit :

if ( $ligne =~ s/.*>(\\d+)\\W(\\d+)<.*/$1$2/ )  



 
 
 :bounce: Ca marche !
 
Ouf ! merci bien, j'en ai lu de la doc aujourd'hui, j'ai la tête  :pt1cable: , heureusement que c'est un besoin perso car j'suis pas doué dans le code ;)  
 
merci encore pour ta patience et ta disponibilité


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Extraction d'une chaine

 

Sujets relatifs
[Perl] extraction de chaineextraction dans une chaine de caractere
Extraction chaine d'un fichier htmlextraction d'une sous chaine de caractere ?
Extraction dans une chaine pour mettre en variable[batch dos] extraction de chaine dans un fichier [resolu + solution]
Tj Pb d extraction de chaine lolPb de VB tt bete sur extraction de chaine
[JavaScript] Manipulation d'une date : extraction de chaine[ASP] Extraction de chaine
Plus de sujets relatifs à : Extraction d'une chaine


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR