Community Spring Cleaning week is here! Join your fellow Maveryx in digging through your old posts and marking comments on them as solved. Learn more here!
Free Trial

Forum

Trouvez des réponses, posez des questions, et partagez votre expertise d’Alteryx.
TIPS de la semaine

Chaque semaine, découvrez de nouvelles astuces et bonnes pratiques pour devenir un expert !

Voir l'index
RÉSOLU

Extraire une partie d'une chaîne de caractère

AdeleD
Atome

Bonjour,

 

Depuis une chaîne de caractères, je dois extraire un montant qui se situe entre "La valeur du smic est [" et le caractère "]" qui vient juste après. Le nombre de caractères du montant à extraire peut varier.

 

Exemple : <html><strong>********* Initialisation (éléments du bulletin) ******** </strong><br><b><u>Calcul du SMIC</u></b><br>Valeur du smic mensuel = [1645.62]<br>Calcul du coefficient du SMIC en fonction du type horaire [$fh]<br><i>Application des règles de l''article D241-7 du CSS</i> smic_coef = (forfait annuel d''heures / heures annuelles max) [0.77162] soit |1240 / 1607|<br> La valeur du smic est [1269.8] coef. final [0.77162] <br>

 

J'ai besoin d'une formule qui renvoie la valeur 1269.8

 

Avec la formule findstring, j'arrive à connaître la position de la chaîne de caractère "La valeur du smic est [".

Pour déterminer la position de fin, il faudrait une formule comme findstring mais dans laquelle on préciserait à partir de quelle position on cherche le caractère car le "]" est présent à différents endroits de la chaîne de caractères.

 

Merci pour votre aide,

7 RÉPONSES 7
mathieuf
Alteryx
Alteryx

@AdeleD j'étais justement en train de travailler sur ce type de cas d'usage 😊

 

Les expressions régulières (RegEx pour les intimes) peuvent être très performantes pour cette situation (il y a une leçon interactive pour en apprendre plus).

 

mathieuf_0-1662584479771.png

Il s'agit de décrire le modèle de ta chaine de caractère, ce qu'il y a entre parenthèse sera ta sortie.

A voir si la précision est suffisante avec toutes tes données !

Emmanuel_G
Pulsar

Bonsoir @AdeleD ,

 

Tu peux utiliser les Regex pour extraire cette valeur. 

 

Tu as un lien où c'est très bien détaillé : Maitrise du regex 

 

Tu trouveras en PJ une solution qui te permettra d'obtenir 1269.8.

 

Emmanuel_G_0-1662585190494.png

 

AdeleD
Atome

Bonsoir @mathieuf  @Emmanuel_G,

 

Un grand merci pour vos réponses et pour les sources de documentation.

J'ai pu récupérer un 2e montant parmi la chaine de caractères et l'outil regex101.com m'a beaucoup aidé.

 

En revanche, je sèche pour extraire le montant situé après la chaîne de caractères "Pondération du Smic en fonction des éléments non minorés soit |1 *"

 

Exemple :

<html><strong>********* Initialisation (éléments du bulletin) ******** </strong><br><b><u>Calcul du SMIC</u></b><br>Valeur du smic mensuel = [1645.62]<br>Calcul du coefficient du SMIC en fonction du type horaire [$fh]<br><i>Application des règles de l''article D241-7 du CSS</i> smic_coef = (forfait annuel d''heures / heures annuelles max) [1] soit |1607 / 1607|<br> La valeur du smic est [1645.62] coef. final [1] <br> Pondération du Smic en fonction des éléments non minorés soit |1 * 312.5 / 1875| coefficient limité à [0.16667] soit un smic de [274.27]<br>

 

Je cherche à avoir la valeur 312.5

J'ai testé l'expression suivante dans RegEx mais la chaîne " |1 *" est reconnue comme opérateur :

AdeleD_0-1662666331942.png

Quelle formule me permettrait de récupérer la valeur recherchée?

 

Merci

 

mathieuf
Alteryx
Alteryx

@AdeleD 

 

ceci retroune la valeur souhaitée : .+non minorés soit\s\|1\s\*\s(\d+.*\d*)\s\/.+ 

AdeleD
Atome

Bonsoir la communauté!

 

@mathieuf : Merci pour l'expression 🙂

 

J'ai 2 contraintes qui m'ont fait modifier les REGEX :

1/ Le nombre recherché dans la chaîne de caractères peut être négatif ou positif

2/ Le nombre recherché dans la chaîne de caractères peut être entier ou décimal.

 

Pour le 1/, j'ai ajouté un | pour que l'expression cherche un positif OU un négatif

Pour le 2/, j'ai dupliqué le REGEX pour avoir une formule qui cherche un entier et une formule qui cherche un nombre décimal.

 

Exemple :

REGEX1 pour récupérer le nombre (positif ou négatif) s'il comporte des décimales :

AdeleD_0-1663699048483.png

 

REGEX2 pour récupérer l'entier (positif ou négatif) : 

AdeleD_1-1663701593698.png

 

Problème :

  • Le fait d'avoir ajouté un OU dans l'expression entraîne 2 nouvelles colonnes en sortie. J'ai testé de leur donner le même intitulé mais ce n'est pas autorisé.

 

AdeleD_2-1663701714477.png

 

  • Le workflow ne dépasse pas les 1% de réalisation et indique que la mémoire nécessaire à l'allocation est supérieure à la mémoire physique disponible. J'ai ce souci depuis l'ajout du ou dans l'expression régulière.

Est-il possible d'optimiser l'expression régulière pour qu'elle réponde aux contraintes et pour que le workflow puisse aboutir?

Pour info, j'ai 8 REGEX car 4 nombres à rechercher dans la chaîne de caractères.

 

Merci pour vos lumières,

 

Adélaïde

Emmanuel_G
Pulsar

@AdeleD 

 

Pour utiliser un OU avec le pipe, il faudrait créer des groupes non marqués avec le pattern ?:

 

En faisant cela, tu auras une seule colonne de sortie pour chaque groupe non marqué. Et c'est dans ce groupe non marqué que tu pourras indiquer le OU avec la barre verticale.

 

Ensuite tu crées un groupe marqué qui englobera ce groupe non marqué. Tu trouveras des détails sur le sujet ici : https://community.alteryx.com/t5/Base-de-Connaissance-Francais/Maitrise-de-l-outil-Regex/ta-p/321434

 

La syntaxe est la suivante : 

 

 

 

.+soit un smic de \[((?:\d+)|(?:-\d+))\]

 

 

 

Je te joins un exemple en PJ.

 

N'hésite pas à marquer cette réponse comme solution si cela répond à ta question. 🙂

 

Emmanuel_G_0-1663710258342.png

 

AdeleD
Atome

Bonjour @Emmanuel_G,

 

Merci pour l'expression, elle est beaucoup plus polyvalente et simplifie considérablement mon workflow.

 

Étiquettes