Posts Tagged ‘quote’

h1

La fonction CATQ pour concaténer tout en ajoutant des guillemets avec SAS 9.3 et plus

février 23, 2019

La fonction catq est disponible depuis SAS 9.3. La particularité de cette fonction est de pouvoir ajouter des guillemets simples (single quotes) ou des guillemets doubles (double quotes) autour des différentes valeurs à concaténer.

Un des avantages de la fonction catq est de pouvoir travailler autant avec les valeurs numériques qu’avec les valeurs caractères. On fera néanmoins attention aux valeurs infinies comme 1/3.

Exemple 1

data catq;
    x=catq('1' ,'ABC ',2," EFG",' ');
    put x=;

    x=catq('2' ,'ABC ',2," EFG",' ');
    put x=;
run;

Dans ce premier exemple, on voit que le 1 permet d’ajouter des guillemets simples alors que le deux permet d’ajouter des guillemets doubles. Dans le cas présent, seules les valeurs caractères ont des guillemets.

x='ABC ' 2 ' EFG' ' '
 x="ABC " 2 " EFG" " "

Exemple 2

data catq;
   x=catq('1'     ,'ABC ',2," EFG",' '); 
   put x=;

   x=catq('1a'    ,'ABC ',2," EFG",' '); 
   put x=;
 
   x=catq('1c'    ,'ABC ',2," EFG",' '); 
   put x=;
   
   x=catq('1ac'    ,'ABC ',2," EFG",' '); 
   put x=;
run;

Dans ce second exemple, on voit que la lettre a pour que toutes les valeurs soient entre guillemets, y compris les valeurs numériques.

Si on souhaite ajouter la virgule (comma) entre les différentes valeurs à concaténer avec la lettre c, il faudra impérativement garder la lettre a.

 x='ABC ' 2 ' EFG' ' '
 x='ABC ' '2' ' EFG' ' '
 x=ABC ,2, EFG,
 x='ABC ','2',' EFG',' '

Exemple 3

Une autre manière d’ajouter la virgule comme séparateur entre les valeurs est d’utiliser la lettre d (delimiter) et de préciser le séparateur dans le second argument de la fonction ; cet argument est optionnel et ne servira qu’avec la lettre d.

data catq;
   x=catq('c','ABC ',2," EFG",' '); 
   put x=;

   x=catq('d',',','ABC ',2," EFG",' '); 
   put x= /;
  
   x=catq('1ac','ABC ',2," EFG",' '); 
   put x=;

   x=catq('1ad',',','ABC ',2," EFG",' '); 
   put x=;
run;

Nous obtenons le même résultat qu’on utilise c ou d avec l’argument optionnel. La lettre d offre juste plus de possibilités.

 x=ABC ,2, EFG,
 x=ABC ,2, EFG,
 x='ABC ','2',' EFG',' '
 x='ABC ','2',' EFG',' '

Exemple 4

Lorsqu’on n’a pas besoin des guillemets autour des différentes valeurs à concaténer, la fonction catq se rapproche de la fonction catx.

data catq;  
   x=catq('d',',','ABC ',2," EFG",' '); 
   put x=/;
   
   x=catq('ds',',','ABC ',2," EFG",' '); 
   put x=;
   
   x=catx(',','ABC ',2," EFG",' ');
   put x=/;
   
   x=catq('dt',',','ABC ',2," EFG",' '); 
   put x=;
run;

Pour enlever les leading et trailing blanks avec la fonction catq, on ajoutera la lettre s (strip).
Pour uniquement enlever les trailing blanks avec la fonction catq, on ajoutera la lettre t (trim).

 x=ABC ,2, EFG,
 x=ABC,2,EFG
 x=ABC,2,EFG
 x=ABC,2, EFG

Aller plus loin

La fonction dispose d’autres arguments pour travailler avec les literals (lettre n), pour afficher les valeurs en hexadecimal (lettre x), pour utiliser une tabulation horizontale comme séparateur (lettre h), etc.
Toutes les informations sont disponibles dans la documentation en ligne : http://support.sas.com/documentation/cdl/en/lefunctionsref/63354/HTML/default/viewer.htm

À lire aussi

h1

Passer de CLASS CLAS à « CLASS » « CLAS » dans une macro variable

février 1, 2013

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 :

  1. le texte d’origine entre guillemets
  2. le partie de texte à remplacer dans cette chaîne de caractères
  3. 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.;