Mettre toutes les mots contenus dans une macro variable entre guillemets (quote en anglais) est un tâche plus fréquente qu’elle n’y paraît.
Une vois le code écrit, il est souvent plus rapide de faire du copier/coller et ensuite de modifier. Voici un exemple où DSN=CLASS CLAS sert à créer DSN_QUOTE= »CLASS » « CLAS ».
1. Exemple dans une macro
Dans l’exemple, la macro est PRINTDSN. Elle a pour tâche d’imprimer dans la log tous les datasets présents dans la bibliothèque SASHELP qui sont cités dans le paramètre de macro DSN, s’ils existent.
%macro printdsn (dsn=); %let dsn =%upcase(&dsn.); %let dsn_quote=%sysfunc(tranwrd(%nrstr(%")&dsn.%nrstr(%"),%str( ),%str(" "))); proc sql; create table ref as select memname from dictionary.tables where upcase(libname)='SASHELP' and upcase(memname) in (&dsn_quote.); quit; data _null_; set ref; call execute ('proc print data=sashelp.' || memname || ';'); call execute ('run;'); run; %mend printdsn; %printdsn(dsn=class clas);
Pour ma part j’ai pris l’habitude de mettre le contenu des macros paramètres en majuscule, et ce dès le début du programme, sauf besoin spécifique contraire. Ceci explique la ligne %let dsn=upcase(&dsn.);
De plus j’ai pris l’habitude de rajouter le suffixe _quote au nom de la macro variable. Dans notre exemple il y a la macro variable DSN mise en majuscule. Cette variable est ensuite mise entre guillemets.
La macro fonction %sysfunc() permet d’utiliser la fonction tranwrd dans une expression macro. La fonction tranwrd est composée de trois paramètres :
- le texte d’origine entre guillemets
- le partie de texte à remplacer dans cette chaîne de caractères
- le texte de remplacement
2. Le même exemple sans macro
L’exemple est présenté dans une macro. Pour tester le code, un simple %let et %put feront l’affaire. Le résultat s’affiche alors dans la log.
%let dsn=CLASS CLAS; %let dsn_quote=%sysfunc(tranwrd(%nrstr(%")&dsn.%nrstr(%"),%str( ),%str(" "); %put &dsn_quote.;