Les expressions régulières donnent à SAS plus de flexibilité dans le travail des chaînes de caractères que les fonctions classique comme INDEX, TRANWRD, SUBSTR ou encore SCAN. Voici un exemple de code remplaçant le contenu dans des crochets.
1. Le data set qui sert d’exemple
A la base on a un fichier TEXT avec une ligne d’observation et une variable TEXT de longueur 50.
TEXT est égal à : ab CD ef [gh] [] [kl] mn [op].
data text;
length text $50;
text=‘ab CD ef [gh] [] [kl] mn [op]’;
run;
2. L’étape data est divisée en trois parties
On veut ici remplacer le contenu entre crochets par un seul et unique x.
data text (drop=rx:);
set text end=eof;
*1. Créer RX1;
retain rx1 0;
if _N_=1 then rx1=rxparse(« ‘[‘ ^'[]’ *’]’ to ‘[x]' »);
*2. Créer NEW_TEXT;
length new_text $50;
call rxchange (rx1,99999, text, new_text);
*3. Supprimer RX1;
if eof then call rxfree(rx1);
run;
Voici le résultat attendu :
3. La premier partie du programme, création de la variable RX1
Extrait du code :
*1. Créer RX1;
retain rx1 0;
if _N_=1 then rx1=rxparse(« ‘[‘ ^'[]’ *’]’ to ‘[x]' »);
Dans un premier temps la variable RX1 est créée au moyen de la fonction RXPARSE qui ne contient qu’un paramètre dont les valeurs sont entre guillemets, ici des guillemets doubles. Il s’agit de remplacer une chaîne de caractères
- qui commence par un crochet ouvrant: ‘[‘
- qui termine par un crochet fermant : ‘*]’
- qui ne contient pas à l’intérieur d’autres paires de crochets : ^'[]’
par
- un x entre crochet : to ‘[x]’
L’opération étant identique pour toutes les observations du data set, il suffit de l’effectuer l’opération quand _N_=1 et d’étendre le résultat à toutes les observations avec un RETAIN rx1 0;. Cela s’avère très bénéfique pour les grandes data sets en terme de performance du programme.
4. La seconde partie du programme, création de la variable NEW_TEXT
Extrait du code :
*2. Créer NEW_TEXT;
length new_text $50;
call rxchange (rx1,99999, text, new_text);
Une nouvelle variable NEW_TEXT de longueur 50 est créée. La fonction CALL RXCHANGE qui sert à la définir est composée de 4 paramètres.
- Tout d’abord RX1 qui donne la chaîne de caractère d’origine et celle par laquelle elle doit être remplacée.
- Ensuite 99999 est un large nombre qui précise le nombre maximum de changements qui peuvent être fait.
- TEXT est la variable d’origine
- NEW_TEXT est le nom de la nouvelle variable.
Notez que pour changer la variable existante plutôt que de créer une nouvelle variable, il vous suffit de limiter la fonction aux trois premiers paramètres.
call rxchange (rx1,99999, text);
5. La troisième et dernière partie, suppression de la variable RX1
Extrait du code :
*3. Supprimer RX1;
if eof then call rxfree(rx1);
Afin de libérer de l’espace en arrière plan, la fonction CALL RXFREE est appelée en fin de programme pour supprimer RX1 en tant qu’indicateur d’expression régulière.
Lecture complémentaire :
Some Practical Ways to Use the New SAS Pattern-Matching Functions, Mike Rhoads, Westat, Rockville, MD (SAS version 6.11 et SAS 6.09 Experimental)