OVH Cloud OVH Cloud

Nettoyage d'un fichier html

23 réponses
Avatar
Escargot
Bonjour,

J'ai convertis un fichier tableur (LibreOffice Calc) en html pour
pouvoir le lire directement avec un navigateur Web.

Ce fichier a dans ses balises des "propriétés" propres à LibreOffice :

sdnum=" [du texte] "
sdval=" [une valeur] "

Comment faire avec Emacs pour enlever toutes ces "propriétés" et rendre
ainsi le fichier html plus léger ?

Le problème (pour moi) est que le texte ou la valeur indiqués entre
guillements ne sont pas toujours les mêmes.

Merci pour vos réponses.

J.

3 réponses

1 2 3
Avatar
Sébastien Kirche
Le 23 octobre 2015 à 13:57, Jean-Jacques Rétorré a dit :

ven. 23 oct. 2015, nous disait que :

> Le mardi 20 octobre 2015 00:27:46 UTC+2, Sébastien Kirche a écrit :
> > Le 19 octobre 2015 à 22:31, Jean-Jacques Rétorré vraute :
> >
> > > > M-x query-replace-regexp RET
> > > >
> > > > motif à rechercher: (sdnum|sdval)=".*"
> > > > à remplacer par "" (chaine vide)
> > >
> > > Je crains que ça ne marche pas si la chaîne à virer est sur
> > > plusieurs lignes.
> >
> > Effectivement, je n'avait pas testé/pensé ce cas en absence de
> > fichier d'exemple.
>
> Attention! Il y a un autre cas!
>
> S'il y a plusieurs propriétés sur la même ligne, comme:
>
> sdnum="v1" p2="v2"
>
> et qu'on veut supprimer sdnum mais pas p2, il ne faut PAS utiliser
> (sdnum|sdval)=".*" qui "matche" toute la ligne, mais plutôt la
> regex proposée par JJ Rétorré: b(sdnum|sdval)="[^"]*"
> éventuellement prolongée par une suite d'espaces



Je n'avais pas envisagé ce cas non plus... Dans l'intervale, je suis
tombé sur un interressant article[¹] sur le fonctionnement d'un moteur
de regex lorsqu'on utilise '.*' avec quelque chose derrière : c'est
plutôt contre-performant et la solution '[^"]' est bien plus
satisfaisante.

J'étudie un peu le fonctionnement des analyseurs lexicaux et des regex
et je sais que tous les moteurs ne fonctionnent pas de la même manière.
Peut-être qu'Emacs ne souffre pas des mêmes tares que Perl[²] au niveau du
backtracking ? Mais les autres problèmes exposés pas J-J Rétorré restent.


> S'il y a un cas comme sdnum="valeur entre "guillemets""
> ça risque d'être encore plus coton...

J'avais appris ici l'usage de cette regexp pour remplacer les "..."
par «...» dans un texte. Que mon tuteur soit remercié.

Un bon moyen de tester une regexp est d'utiliser re-builder sur un
fichier choisi à cet effet.



J'ai prototypé avec re-builder, mais c'est bien connu : le programmeur
teste toujours les cas qu'_il_ a prévu :o)


[¹] https://blog.mariusschulz.com/2014/06/03/why-using-in-regular-expressions-is-almost-never-what-you-actually-want
[²] https://swtch.com/~rsc/regexp/regexp1.html
--
Sébastien Kirche
Avatar
Escargot
Le 19/10/2015 22:21, Jean-Jacques Rétorré a écrit :
lun. 19 oct. 2015, Escargot nous disait que :

Bonjour,

J'ai convertis un fichier tableur (LibreOffice Calc) en html pour
pouvoir le lire directement avec un navigateur Web.

Ce fichier a dans ses balises des "propriétés" propres à LibreOffice :

sdnum=" [du texte] "
sdval=" [une valeur] "

Comment faire avec Emacs pour enlever toutes ces "propriétés" et
rendre ainsi le fichier html plus léger ?

Le problème (pour moi) est que le texte ou la valeur indiqués entre
guillements ne sont pas toujours les mêmes.

Merci pour vos réponses.

J.



La regerxp :

b(sdnum|sdval)="[^"]*"

matche toutes les expressions
que tu veux éliminer (chais plus comment on dit en français). Il suffit
de faire une recherche et remplacement par une chaîne vide.

Par exemple

C-M-% b(sdnum|sdval)="[^"]*" RET RET !




Merci pour cette excellente réponse.

Je n'ai pu répondre plus tôt ayant eu une panne Internet.

J.
Avatar
Lucas Levrel
Le 24 octobre 2015, Sébastien Kirche a écrit :

Je n'avais pas envisagé ce cas non plus... Dans l'intervale, je suis
tombé sur un interressant article[¹] sur le fonctionnement d'un moteur
de regex lorsqu'on utilise '.*' avec quelque chose derrière : c'est
plutôt contre-performant et la solution '[^"]' est bien plus
satisfaisante.

J'étudie un peu le fonctionnement des analyseurs lexicaux et des regex
et je sais que tous les moteurs ne fonctionnent pas de la même manière.
Peut-être qu'Emacs ne souffre pas des mêmes tares que Perl[²] au niveau du
backtracking ? Mais les autres problèmes exposés pas J-J Rétorré restent.



Pour obtenir le même effet que [^"] j'aurais plutôt mis .*? qui ne
devrait pas (?) poser le problème du backtracking.

--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
1 2 3