Posts Tagged ‘RXPARSE’

h1

Les expressions régulières, un exemple avec des crochets à remplacer

février 8, 2010

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.

  1. Tout d’abord RX1 qui donne la chaîne de caractère d’origine et celle par laquelle elle doit être remplacée.
  2. Ensuite 99999 est un large nombre qui précise le nombre maximum de changements qui peuvent être fait.
  3. TEXT est la variable d’origine
  4. 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)

h1

4 fonctions pour enlever les blancs !

janvier 29, 2008

1. Enlever les blancs aux extrémités

Comprendre les anciens programmes et les fonctions TRIM et LEFT : jusqu’à la version SAS 8.2, pour enlever les blancs en début de la chaîne de caractères (leading blank), on les déplaçait à la fin de la chaîne (trailing blank) via LEFT, puis on les enlevait avec TRIM. Cela avait plusieurs inconvénients :

  • Il fallait utiliser deux fonctions TRIM et LEFT ;
  • Il ne fallait pas inverser l’ordre de ces deux fonctions, faute de quoi on arrivait à un résultat différent de ses attentes ;
  • Quand on appliquait cette méthode sur une chaîne de caractère vide, on se retrouvait avec une longueur de 1 au lieu de 0 ; la fonction TRIMN, qui résout ce dernier point, n’est venue qu’après, avec SAS V9.

Savoir utiliser les dernières avancées de SAS, la fonction STRIP : depuis SAS 9.1.3, la fonction STRIP résout les trois problèmes. C’est équivalent à TRIMN(LEFT()).

Si vous enlevez les blancs pour pouvoir faire une concaténation, pensez aux fonctions CATS, CATT et CATX. Pour plus de précisions, vous pouvez vous reporter à l’article « La concaténation : 4 fonctions SAS 9« .

2. Garder un seul blanc entre les mots. Vive la fonction COMPBL : il vous faudra en général un seul espace entre les mots de votre texte. Enlevez alors les doublons via la fonction COMPBL. Vous enlèverez ainsi tous les blancs en fin de chaîne sauf un.

3. Enlever tous les blancs. Vive la fonction COMPRESS : par défaut, la fonction COMPRESS enlève tous les blancs de votre texte. Ajoutez un deuxième paramètre et elle pourra vous enlever d’autres types de caractères. Mais cela dépasse le sujet d’aujourd’hui.

4. Supprimer les x premiers blancs avec RXPARSE et CALL RXCHANGE : la notation qui suit permet de remplacer n’importe quel type de texte par un autre. Ici nous nous limitons aux blancs. Dans un premier temps, définissez la valeur d’avant et la valeur d’après dans RXPARSE. Puis, dans un second temps, définissez les trois voir quatre paramètres de CALL RXCHANGE, à savoir :

  • rappelez cette définition,
  • précisez la variable à actualiser et
  • donner le nombre de fois qu’un changement doit avoir lieu.
  • par défaut, la variable d’origine sera actualisée. Pour créer une nouvelle variable, ajoutez un quatrième paramètre à CALL RXCHANGE ; la longueur de votre nouvelle variable sera de 200 à moins de l’avoir définie autrement auparavant ;

Truc : il ne peut pas y avoir plus de changement que de caractères dans la chaîne. Alors pourquoi ne pas prendre cette longueur pour remplacer tous les blancs. La fonction LENGTHN inclura les blancs en fin de texte et pourra gérer les chaînes de longueur 0.

Un exemple : voici un exemple d’une variable y de longueur 30 qui est créée à partir de la variable x à laquelle on a enlevé ses six blancs.

data one;
   length y $30;
   x= ' ZZZ ABCD AB ' ;
   rx=rxparse(" ' ' to ");
   call rxchange (rx,lengthc(x),x,y);
run;