Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Newbie question

6 réponses
Avatar
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.

6 réponses

Avatar
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.


heu une petite erreur il faut lire :

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

Avatar
espie
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.
Avatar
mosfet
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

Avatar
nospam
mosfet wrote:

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--

Avatar
nospam
Broke wrote:

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 wrote:

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--



Avatar
Klaus
On Mar 6, 1:03 pm, mosfet wrote:
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