Les balises HTML sont des mots entourés de < et > servant à la mise en forme de pages Internet. Dans l’exemple qui suit le but est d’enlever avec SAS des balises HTML contenues dans une variable appelée DESCRIP au moyen d’une boucle. Cet exemple, basé sur un cas réel, permettra d’illustrer la syntaxe de DO UNTIL et de DO WHILE.
1. La fonction SUBSTR pour enlever un symbole <…>
Pour enlever une balise, je choisis ici de remplacer la chaîne commencant par < et se terminannat par > au moyen de la fonction SUBSTR. Pour ce faire,
- paramètre 1 : donner le nom de la variable en premier
- paramètre 2 : préciser la position du symbole < en second
- paramètre 3 : donner la longueur du texte en calculant le nombre de caractères entre ce symbole de début de balise et celui de fin (position de su symbole de fin > – position du symbole de début < + 1).
data no_tag (drop=tag:);
descrip=‘<p>my text</p>’;
tag_start = index(descrip,‘<‘);
tag_end = index(descrip,‘>’);
substr(descrip,tag_start,tag_end-tag_start+1)=‘ ‘;
run;
Ici le texte à mettre à jour est <p>my text</p>. Cette première étape data remplace la première balise et seulement la première. Pour des raisons de lisibilité, j’ai choisi de créer deux variables intermédiaires qui retourne la position de < (variable TAG_START) et de > (TAG_END) au moyen de la fonction INDEX.
En fin d’étape data, toutes les variables dont le nom commence par TAG sont supprimée grâce à l’option DROP.
2. Répéter l’opération au moyen d’une boucle DO UNTIL
A chaque exécution de la boucle la variable DESCRIP est mise à jour : une balise <…> est enlevée.
La boucle sera exécutée jusqu’à ce qu’aucun symbole < ne soit identifié. En d’autres termes, la boucle sera exécutée jusqu’à ce que la fonction INDEX retourne la valeur zéro.
data no_tag (drop=tag:);
descrip=‘<p>my text</p>’;
do until(index(descrip,‘<‘)=0);
tag_start = index(descrip,‘<‘);
tag_end = index(descrip,‘>’);
substr(descrip,tag_start,tag_end-tag_start+1)=’ ‘;
end;
run;
3. Répéter l’opération au moyen d’une boucle DO WHILE
A chaque exécution de la boucle la variable DESCRIP est mise à jour : une balise <…> est enlevée.
La boucle sera exécutée tant qu’un symbole < sera identifié. En d’autres termes, la boucle sera exécutée tant que la fonction INDEX ne retournera pas la valeur zéro.
data no_tag (drop=tag:);
descrip=‘<p>my text</p>’;
do while(index(descrip,‘<‘) ne 0);
tag_start = index(descrip,‘<‘);
tag_end = index(descrip,‘>’);
substr(descrip,tag_start,tag_end-tag_start+1)=‘ ‘;
end;
run;
Avec DO UNTIL et DO WHILE, il faut faire attention aux boucles infinies. Si la condition pour sortir de la boucle n’est jamais obtenue. L’exécution continue sans fin.
Lectures complémentaires
Sur le blog www.sasreference.fr
- Les deux visages de la fonction SUBSTR
- Mon petit doigt me dit que le mot commence en position 2 (Fonction INDEX)
Online Doc
- DO WHILE Statement
- DO UNTIL Statement