support clients /

Les nouveautés de Base SAS® en version 9.2

Pour toujours mieux répondre à vos attentes, le langage SAS s’est une nouvelle fois enrichi d’une multitude de nouveautés. Cet article vous présente quelques morceaux choisis concernant le traitement des chaînes de caractères, les étapes DATA et le macro-langage.

Nouvelles fonctions et routines

- TRANSTRN

A l'instar de TRANWRD, cette fonction permet de remplacer un caractère ou une chaîne de caractères par une autre, à la différence près qu'elle permet de remplacer par une chaîne dont la longueur est nulle tandis que TRANWRD remplace par un espace.

Exemple :

Ce programme :
data _null_;
 texte="nouvelles fonctions et routines" ;
 AvecTRANSTRN=TRANSTRN (texte, 's', trimn('')) ;
 AvecTRANWRD =TRANWRD (texte, 's', trimn('')) ;
 put AvecTRANSTRN ;
 put AvecTRANWRD ;
run;
 

donne le résultat suivant :

nouvelle fonction et routine
nouvelle  fonction  et routine

- CALL SORTC et CALL SORTN 

Expérimentales en 9.1, ces routines sont désormais valides et intégrées à la documentation. Elles trient les valeurs pour l'observation en cours de traitement : ainsi la 1ère variable contiendra la 1ère valeur, la seconde variable contiendra la 2ème valeur etc. CALL SORTC permet de trier les variables caractères et CALL SORTN les variables numériques.

Exemple :

Ce programme :
data _null_;
   var1="A" ; var2="E" ; var3="C" ; var4="B" ; var5="D";
   put 'AVANT ' _all_ ;
   call sortc(of var1-var5);
   put 'APRES ' _all_;
run;
 

donne le résultat suivant :

AVANT var1=A var2=E var3=C var4=B var5=D _ERROR_=0 _N_=1
APRES var1=A var2=B var3=C var4=D var5=E _ERROR_=0 _N_=1

- CHAR, COUNTW, FIRST, FINDW, WHICHC

Expérimentales en 9.1, elles sont désormais valides et intégrées à la documentation. Traitant des chaînes de caractères, elles sont pratiques car elles permettent de réduire plusieurs lignes de code en une seule instruction. En effet, le résultat de ces fonctions peut également être obtenu en combinant les fonctions SUBSTR, INDEX, SCAN. Elles permettent donc d'alléger le code.

  • CHAR renvoie le caractère présent à une position donnée dans une chaîne de caractères.
  • COUNTW renvoie le nombre de mots dans une chaîne de caractères.
  • FIRST renvoie le premier caractère d'une chaîne de caractères.
  • FINDW recherche un mot dans une chaîne de caractères, et renvoie sa position.
  • WHICHC recherche un mot dans la liste des paramètres donnés, et renvoie le n° de l'argument.

Exemple :

Ce programme :
data _null_;
  texte="Nouvelles fonctions et routines" ;
  char=char (texte, 5) ;
  First=first (texte) ;
  countw=countw (texte) ;
  find=find (texte, "fonc") ;
  var1="fonction" ; var2="macro" ; var3="routines" ; var4="option" ; var5="proc";
  whichc=whichc('routines', of var1-var5 ) ;
  put "char (texte, 5)=" char '=> le 5ème caractère est ' char;
  put "first (texte)=" first '=> le 1er caractère est ' first;
  put "whichc('routines', of var1-var5 )=" whichc '=> la ' whichc 'ème variable est égale à routines';
  put "find (texte, 'fonc') =" find '=> le texte fonc a été trouvé à la position ' find;
  put "countw (texte)=" countw '=> la phrase a ' countw 'mots';
run;

donne le résultat suivant :

char (texte, 5)=e => le 5ème caractère est e
first (texte)=N => le 1er caractère est N
whichc('routines', of var1-var5 )=3 => la 3ème variable est égale à routines
find (texte, 'fonc') =11 => le texte fonc a été trouvé à la position 11
countw (texte)=4 => la phrase a 4 mots

Etape DATA

Les instructions MERGE et SET acceptent désormais :

  • les plages de valeurs : par exemple « Table1 – Table5 » signifie que les tables Table1, Table2, Table3, Table4 et Table5 seront lues.
  • les préfixes : par exemple « Table: » signifie que toutes les tables de la bibliothèque commençant par le mot TABLE seront lues.

De plus, l'instruction SET bénéficie d'une nouvelle option, INDSNAME, qui permet d'identifier le nom de la table dont l'observation est issue. C'est une alternative à l'utilisation du IN=, qui a de plus l'avantage de donner le nom de la table.

Exemple de plage de valeurs :

Le programme suivant lit 6 tables mensualisées (les tables en entrée ont été créées à partir de SASHELP.CARS) :
  Data Cars_2010 ;
    set Cars_201001 - Cars_201006 INDSNAME=TableSource;
    by make ;
        Annee=input (substr (scan(TableSource, -1,  '._'), 1, 4), 4.) ;
        Mois=input (substr (scan(TableSource, -1,  '._'), 5, 2), 3.) ;
  run;
 

Le fichier de log indique :

NOTE: There were 4065 observations read from the data set WORK.CARS_201001.
NOTE: There were 4065 observations read from the data set WORK.CARS_201002.
NOTE: There were 3805 observations read from the data set WORK.CARS_201003.
NOTE: There were 3805 observations read from the data set WORK.CARS_201004.
NOTE: There were 4033 observations read from the data set WORK.CARS_201005.
NOTE: There were 4033 observations read from the data set WORK.CARS_201006.
NOTE: The data set WORK.CARS_2010 has 23806 observations and 3 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.03 seconds

Exemple de préfixe:

Le programme suivant croise toutes les tables dont le nom commence par cars_ :
  Data Cars_total ;
    merge cars_: ;
    by make ;
  run;
 

Le fichier de log indique :

NOTE: MERGE statement has more than one data set with repeats of BY values.
NOTE: There were 8429 observations read from the data set WORK.CARS_CYLINDERS.
NOTE: There were 8233 observations read from the data set WORK.CARS_ENGINESIZE.
NOTE: There were 8233 observations read from the data set WORK.CARS_INVOICE.
NOTE: There were 8540 observations read from the data set WORK.CARS_MSRP.
NOTE: The data set WORK.CARS_TOTAL has 9109 observations and 17 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds

Macro-langage

Quelques nouveautés sont à souligner, telles que :

  • les nouvelles macro-variables automatiques &SYSERRORTEXT et &SYSWARNINGTEXT, contenant respectivement le dernier message d'erreur et le dernier message d'avertissement reçu.
  • L’option MINOPERATOR permet d’utiliser l’opérateur IN dans une condition en macro-langage. Sans cette option, IN est traité comme du texte. 
  • L'option MEXECSIZE limite la mémoire utilisable pour une macro compilée.
  • L'option SECURE, positionnée au niveau de l'instruction %MACRO, protège l'édition du code d'un macro-programme compilé.

Exemple d’utilisation du IN :
Le programme compare la macro-variable VAL à une liste de valeurs pour décider d’une action :
options minoperator  ;

%macro  m ;
  %let val=cars;
  %if &val in cars prdsal class %then
      proc print data=sashelp.&val ;
      ;
   run ;
%mend;

Conclusion

Cet article vous a présenté une partie des nouveautés de SAS 9.2. D'autres sont à découvrir dans la documentation en ligne , mais également dans les articles en ligne, tel que It's the Little Things That Count par exemple.

Géraldine CADE-DESCHAMPS
Consultant Support Clients SAS France