Newbie question

Le
mosfet
Bonjour,

j'ai un fichier HTML super simple decrit ci-dessous dont j'aimerais
extraire certaines données. N'ayant pas fait de Perl depuis plus de 4
ans j'aurais besoin d'un petit coup de pouce.
Le fichier en question est une table decrivant le code des msgs windows,
il ressemble à ca :



<td>WM_ACTIVATE</td>
<td>0x0006</td>
<td></td>
<td>0x0000</td>
<td>WM_NULL</td>
</tr>

J'aimerais extraire ces codes pour obtenir la structure suivante :

enum foo
{
eWM_ACTIVATE = 0x0006,
eWM_NULL = 0x0001,

};

ou peut etre meme

enum foo
{
eWM_ACTIVATE = WM_ACTIVATE,
eWM_NULL = WM_ACTIVATE,

};

etant donné que les msg sont des defines.

Comment puis je faire ?
Peut etre qu'avec une regex bien placé ca doit le faire.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
mosfet
Le #140234
Bonjour,

j'ai un fichier HTML super simple decrit ci-dessous dont j'aimerais
extraire certaines données. N'ayant pas fait de Perl depuis plus de 4
ans j'aurais besoin d'un petit coup de pouce.
Le fichier en question est une table decrivant le code des msgs windows,
il ressemble à ca :


...
<td>WM_ACTIVATE</td>
<td>0x0006</td>
<td></td>
<td>0x0000</td>
<td>WM_NULL</td>
</tr>
...
J'aimerais extraire ces codes pour obtenir la structure suivante :

enum foo
{
eWM_ACTIVATE = 0x0006,
eWM_NULL = 0x0001,
...
};

ou peut etre meme

enum foo
{
eWM_ACTIVATE = WM_ACTIVATE,
eWM_NULL = WM_ACTIVATE,
...
};

etant donné que les msg sont des defines.

Comment puis je faire ?
Peut etre qu'avec une regex bien placé ca doit le faire.


heu une petite erreur il faut lire :

enum foo
{
eWM_ACTIVATE = 0x0006,
eWM_NULL = 0x0000,
...
};

espie
Le #140233
manque des bouts de ton fichier...

Ceci dit, ca a quand meme une tete de HTML, voire de xHTML.
Plutot qu'une regexp, qui va toujours merdoyer dans les grandes
largeurs sur ce genre de trucs, j'utiliserais directement un
module adapte.

HTML::Parser ou sa surcouche HTML::Tree me semblent tres adaptes...

Est-ce que c'est un marteau-pilon pour ecraser trois mouches ?
peut-etre... ca depend si tu veux avoir le resultat rapidement, ou
si tu veux que ca calcule le resultat rapidement.
mosfet
Le #140232
manque des bouts de ton fichier...

Ceci dit, ca a quand meme une tete de HTML, voire de xHTML.
Plutot qu'une regexp, qui va toujours merdoyer dans les grandes
largeurs sur ce genre de trucs, j'utiliserais directement un
module adapte.

HTML::Parser ou sa surcouche HTML::Tree me semblent tres adaptes...

Est-ce que c'est un marteau-pilon pour ecraser trois mouches ?
peut-etre... ca depend si tu veux avoir le resultat rapidement, ou
si tu veux que ca calcule le resultat rapidement.
Peut m'importe. Je veux juste un resultat quelque soit la facon.

En gros le motif suivant se repete tout au long du fichier :

<tr>
<td>WM_ACTIVATE</td>
<td>0x0006</td>
<td></td>
<td>0x0000</td>
<td>WM_NULL</td>
</tr>

cad Nom : WM_ACTIVATE
Code : 0x0006
Code : 0x0000
Nom : WM_NULL

LA seule difficulté c'est que ca ne garde pas le meme ordre

nospam
Le #140230
mosfet
Bonjour,

j'ai un fichier HTML super simple decrit ci-dessous dont j'aimerais
extraire certaines données. N'ayant pas fait de Perl depuis plus de 4
ans j'aurais besoin d'un petit coup de pouce.
Le fichier en question est une table decrivant le code des msgs windows,
il ressemble à ca :


...
<td>WM_ACTIVATE</td>
<td>0x0006</td>
<td></td>
<td>0x0000</td>
<td>WM_NULL</td>
</tr>
...
J'aimerais extraire ces codes pour obtenir la structure suivante :

enum foo
{
eWM_ACTIVATE = 0x0006,
eWM_NULL = 0x0001,
...
};

ou peut etre meme

enum foo
{
eWM_ACTIVATE = WM_ACTIVATE,
eWM_NULL = WM_ACTIVATE,
...
};

etant donné que les msg sont des defines.

Comment puis je faire ?
Peut etre qu'avec une regex bien placé ca doit le faire.


Bonjour,

Essaie ceci,

#!/usr/bin/perl
use strict;
use warnings;

@ARGV = "/Users/Broke/Desktop/data.html";
#ecrire ici le chemin d'acces a ton fichier.
#s'il y a plusieurs fichiers ils doivent
#etre entoures d'un parenthese et separes
#par des virgules.
#comme ceci: (xx/xx/xx/fichier, pareil,
#pareil)
while (my $line = <>) {

if ($line =~ m#^s*?<td.(WM_A.+)</.+$#) {
print 'cad Nom :'.$1."n";
}
if ($line =~ m#^s*?<td.s*(d[^d]d+).+$#) {
print ' Code : '.$1."n";
}
if ($line =~ m#^s*?<td.(WM_N.+)</.+$#) {
print ' Nom : '.$1."n";
}
}

#--FIN--

nospam
Le #140121
Broke
Salut,

Le Regexp que j'ai poste ne tient pas
compte d'une erreur de codage HTML et
d'espaces involontaires voici le code
corrige qui en tient compte:
@ARGV = "/Users/Broke/Desktop/ton_fichier.html";
#ecrire ici le chemin d'acces a ton fichier.
#s'il y a plusieurs fichiers ils doivent
#etre entoures d'une parenthese et separes
#par des virgules.
#comme ceci: (xx/xx/xx/fichier, pareil,
#pareil)
while (my $line = <>) {

if ($line =~ m#^s*?<td.(WM_A.+)</.+$#) {
print 'cad Nom :'.$1."n";
}
if ($line =~ m#^s*?<td.s*?(d[^d]d+).+$#) {
print ' Code : '.$1."n";
}
if ($line =~ m#^s*?<td.s*?(WM_N.+)</.+$#) {
print ' Nom : '.$1."n";
}
}

#--FIN--

mosfet
Bonjour,

j'ai un fichier HTML super simple decrit ci-dessous dont j'aimerais
extraire certaines données. N'ayant pas fait de Perl depuis plus de 4
ans j'aurais besoin d'un petit coup de pouce.
Le fichier en question est une table decrivant le code des msgs windows,
il ressemble à ca :


...
<td>WM_ACTIVATE</td>
<td>0x0006</td>
<td></td>
<td>0x0000</td>
<td>WM_NULL</td>
</tr>
...
J'aimerais extraire ces codes pour obtenir la structure suivante :

enum foo
{
eWM_ACTIVATE = 0x0006,
eWM_NULL = 0x0001,
...
};

ou peut etre meme

enum foo
{
eWM_ACTIVATE = WM_ACTIVATE,
eWM_NULL = WM_ACTIVATE,
...
};

etant donné que les msg sont des defines.

Comment puis je faire ?
Peut etre qu'avec une regex bien placé ca doit le faire.


Bonjour,

Essaie ceci,

#!/usr/bin/perl
use strict;
use warnings;

@ARGV = "/Users/Broke/Desktop/data.html";
#ecrire ici le chemin d'acces a ton fichier.
#s'il y a plusieurs fichiers ils doivent
#etre entoures d'un parenthese et separes
#par des virgules.
#comme ceci: (xx/xx/xx/fichier, pareil,
#pareil)
while (my $line = <>) {

if ($line =~ m#^s*?<td.(WM_A.+)</.+$#) {
print 'cad Nom :'.$1."n";
}
if ($line =~ m#^s*?<td.s*(d[^d]d+).+$#) {
print ' Code : '.$1."n";
}
if ($line =~ m#^s*?<td.(WM_N.+)</.+$#) {
print ' Nom : '.$1."n";
}
}

#--FIN--



Klaus
Le #140116
On Mar 6, 1:03 pm, mosfet
Marc Espie a écrit :> manque des bouts de ton fichier...

Ceci dit, ca a quand meme une tete de HTML, voire de xHTML.
Plutot qu'une regexp, qui va toujours merdoyer dans les grandes
largeurs sur ce genre de trucs, j'utiliserais directement un
module adapte.

HTML::Parser ou sa surcouche HTML::Tree me semblent tres adaptes...

Est-ce que c'est un marteau-pilon pour ecraser trois mouches ?
peut-etre... ca depend si tu veux avoir le resultat rapidement, ou
si tu veux que ca calcule le resultat rapidement.


Peut m'importe. Je veux juste un resultat quelque soit la facon.


je propose de lire d'abord
Perlfaq 6: Est-ce possible d'utiliser les expressions rationnelles de
Perl pour reconnaître du texte bien équilibré ?
http://perl.enstimac.fr/DocFr/perlfaq6.html#estce%20possible%20d'utiliser%2 0les%20expressions%20rationnelles%20de%20perl%20pour%20reconna%EEtre%20du%2 0texte%20bien%20%E9quilibr%E9

--
Klaus


Publicité
Poster une réponse
Anonyme