Outils pour utilisateurs

Outils du site


Panneau latéral

liens utiles

cenabumix

Site Cenabumix principal : http://www.cenabumix.org/wordpress/

Groupe Cenabumix framavox: https://framavox.org/g/6jsFiPzq/cenabumix

Dokuwiki

Accueil sommaire

Aide a la syntaxe :

calc_et_regex

REGEX et Calc

Soit un exercice de la vraie vie, vous trouverez le lien pour télécharger un exercice

https://framadrive.org/s/wzHPwB8x5QGkYMt

et un lien vers le contenu en ods

https://framadrive.org/s/r9riKenj7dWrgsG

exercice comportant 74 lignes dont 73 de données en colonne B. C’est cette colonne que je veux retravailler afin de supprimer toutes les lettres et ponctuation pour ne conserver que les 5 derniers caractères de cette donnée (cellule B2) 099005431E0, soit, le but à atteindre, c’est d’obtenir 431E0. De plus, dans certaines cellules (B3 par exemple), j’ai plusieurs données qui ont la même structure et je veux n’avoir que ces derniers caractères dans chaque colonne. Exemple, en B3, j’ai ceci :

Filtre structurel codique : , CENTRE
(099005)
Identifiant organisme
(CODE_XXXXXXXX), liste de valeurs
autorisées : 099005414P2, 099005414B0,
099005414P4, 099005414C0, 099005414N0, 099005414E0,
09900541400

Et je veux ceci :

414P2414B0414P4414C0414N0414E0

Nous allons devoir travailler par touches successives et supprimer progressivement les informations dont nous n’avons pas besoin.

Commençons par le début du texte et observons-le. En cellule B3, comme vu ci-dessus, je vois des virgules, mais je ne peux pas toutes les supprimer. Vous verrez plus loin pourquoi je veux les conserver.

Cela dit, les supprimer serait très simple : mettre la colonne B en surbrillance, « Édition » puis « Rechercher et remplacer » (ou Ctrl h, je vous rappelle que je suis un fainéant assumé). Mettre la virgule dans le champ « Rechercher », rien dans le champ « Remplacer » et décocher la case « Expressions régulières » puis cliquer sur « Tout remplacer ». Les virgules ont disparu, mais ce n’est pas ce que je voulais que nous fassions. Pas de panique, vous fermez la fenêtre « Rechercher et remplacer », Ctrl z et vous retrouverez vos champs comme ils étaient avant la correction fautive.

Nous voyons des parenthèses ouvrantes et fermantes.

Nous allons donc supprimer tous les caractères jusqu’à la dernière parenthèse fermante (mettez la colonne B en surbrillance) avec Ctrl h, .*\) (je dis bien point, astérisque, antislash et parenthèse fermante) dans le champ « Rechercher », rien dans le champ « Remplacer », cochez les cases « Expressions régulières » et « Sélection active seulement » puis cliquez sur « Tout remplacer ».

La cellule B3 se présente maintenant comme ceci, et nous approchons de la solution :

liste de valeurs autorisées : 099005414P2,
099005414B0, 099005414P4,
099005414C0, 099005414N0,
099005414E0, 09900541400

Expliquons ce que nous avons mis dans le champ « Rechercher », à savoir .*\)

Je vous renvoie à cette page de l’aide que nous avons déjà rencontrée : https://help.libreoffice.org/6.2/fr/text/shared/01/02100001.html?&DbPAR=WRITER&System=WIN

Vous trouverez l’essentiel des REGEX (expressions régulières) avec leur utilisation. Nous voyons que le point « Correspond à un caractère unique de tout type, sauf un retour à la ligne ou un saut de paragraphe. » L’astérisque : « Permet de trouver le caractère zéro ou l'un des caractères se trouvant avant “*” » En l’occurrence, l’astérisque précédé du point permet de rechercher n’importe quel caractère un nombre quelconque de fois.

Nous trouvons ensuite l’antislash qui « protège » (échappe ou escape en langage informatique) la parenthèse fermante. En effet, là, nous cherchons précisément le caractère ). Or, ce caractère a une autre signification en REGEX. En le protégeant, il perd cette signification.

Avec .*\), nous avons demandé à Calc de supprimer tout type de caractères un nombre quelconque de fois jusqu’à une parenthèse fermante.

Nous observons notre cellule B3 (c’est pareil d’ailleurs pour toute la colonne B). Nous voyons une espace (je rappelle qu’en typographie, espace est féminin) suivie du mot « liste ». Cette phrase se termine avec une espace, deux points (:) et une espace. Nous allons donc remettre en surbrillance la colonne B, faire Ctrl h, placer .*: (je dis bien point, astérisque, deux points superposés et une espace) dans « Rechercher », rien dans « Remplacer », les cases « Sélection active seulement » et « Expressions régulières » sont bien cochées. Cliquez sur « Remplacer tout ».

La cellule B3 (comme les autres) se présente ainsi :

099005414P2, 099005414B0,
099005414P4, 099005414C0,
099005414N0, 099005414E0,
09900541400

Nous avons presque terminé. Il nous faut supprimer le nombre 099005 au début de chaque donnée. C’est très simple et les REGEX nous sont inutiles : Ctrl h, 099005 dans le champ « Rechercher », rien dans « Remplacer », la case « Sélection active seulement » est cochée, peu importe si celle des expressions régulières l’est ou pas et on valide. Notre cellule B3 est maintenant de la forme :

414P2, 414B0, 414P4, 414C0,
414N0, 414E0, 41400

Nous sommes tout près de but. LibreOffice va nous aider à présenter nos colonnes comme nous le souhaitions (et il va nous faire 2 farces en même temps). Vous allez mettre la colonne B en surbrillance, puis « Données », en bas « Texte en colonnes », vous cochez la case « Virgule » et vous validez. Vous voyez que LibreOffice a pris la virgule comme séparateur de champ (voilà pourquoi il nous fallait conserver cette ponctuation) et a bien présenté nos champs comme nous le souhaitions, mais emporte 2 anomalies graves : en ligne 3, nous n’avons plus qu’une information au lieu des 7 attendues. De plus, LibreOffice a considéré que le champ 431E0 était une notation scientifique qu’il a transformée en 4.31E+2 (à savoir 4,31 *102 soit 431), ce n’était pas le but poursuivi.

Ctrl z pour remettre les choses en place et observons bien ce qu’il s’est passé.

D’abord, Calc est un tableur qui, logiquement, traite a priori des nombres (d’où la transformation de 431E0 en notation scientifique fautive). Nous allons lui dire que nous ne traitons que du texte en mettant tout notre tableau en surbrillance (Ctrl a), puis « Format », « Effacer le formatage direct » (ou en plus simple, Ctrl a puis Ctrl m). La structure de notre tableur évolue. Peu importe.

À nouveau Ctrl a pour tout sélectionner, « Format », « Cellule » et nous cliquons sur « Texte » puis OK. Il ne s’est rien passé. En réalité si, tout notre tableau est passé en texte et 431E0 ne sera plus interprété comme étant un nombre.

Nous mettons en surbrillance la colonne B, « Données », « Texte en colonnes », la virgule reste proposée comme séparateur. Nous validons.

Le champ 431E0 est maintenant bien affiché, mais nous voyons que, en cellule B3, nous avons perdu des informations. De plus, les cellules B4, B6, B12 etc sont mal présentées.

Ctrl z et tout revient comme avant et observons bien notre B3. Elle débute par un saut de paragraphe (invisible) :

414P2, 414B0, 414P4, 414C0,
414N0, 414E0, 41400

L’anomalie vient de là. En mettant le texte en colonnes, LibreOffice considère que ce saut de paragraphe l’oblige à placer les données de la cellule B3 en ligne 4 ! Nous allons devoir supprimer préalablement ce saut de ligne.

Ctrl h, puis, dans le champ « Rechercher », nous plaçons \n et nous validons. Notre cellule B3 est devenue :

414P2, 414B0, 414P4, 414C0,
414N0, 414E0, 41400

\n (je dis bien antislash et la lettre n sans rien d’autre) fait partie de la liste des expressions régulières et représente un saut de ligne, dans une cellule au cas particulier. Nous l’avons supprimé. Nous pouvons maintenant mettre en surbrillance la colonne B puis « Données », « Texte en colonnes » et valider.

La ligne 3, comme les autres, est maintenant conforme au but recherché :

CELINE414P2414B0414P4414C0414N0414E041400

Au cas particulier de cet exercice, le tableur sur lequel nous avons travaillé est une véritable extraction anonymisée d’un logiciel professionnel. Il comportait à la base plusieurs milliers de lignes. Difficile d’imaginer les corriger une à une !

calc_et_regex.txt · Dernière modification: 2020/11/21 11:55 de jean