Publié le :
Macro CREATION_INTERNE

Macro utilitaire QCATX - Concaténation avec gestion du quoting

La fonction CATX standard utilisée via %SYSFUNC peut poser des problèmes d'évaluation avec des caractères spéciaux ou des types mixtes. Cette macro %QCATX utilise l'option PARMBUFF pour accepter un nombre variable d'arguments. Elle extrait le premier argument comme séparateur et boucle sur les suivants pour les concaténer s'ils ne sont pas vides, en utilisant des fonctions de quoting (%QSCAN, %QSUBSTR) pour sécuriser le résultat.
Analyse des données

Type : CREATION_INTERNE


La macro traite uniquement les chaînes de caractères passées en arguments lors de son appel.

1 Bloc de code
MACRO
Explication :
Définition de la macro. Elle nettoie &syspbuff pour retirer les parenthèses, isole le délimiteur, puis itère sur les éléments restants pour construire la chaîne de sortie en insérant le délimiteur uniquement si nécessaire (gestion via la variable locale &prefix).
Copié !
1%macro qcatx /parmbuff;
2/*---------------------------------------------------------------------------
3Mimic CATX() function as a macro function. Return results with macro quoting.
4 
5The CAT... series of functions do not work well with %SYSFUNC() because they
6can accept either numeric or character values. So %SYSFUNC() has to try
7and figure out if the value you passed is a number or a string. Which can
8cause unwanted messages in the LOG and worse.
9 
10Example issue with %sysfunc(catx()):
11 
12 1 %put |%sysfunc(catx(^,a,,c))|;
13 ERROR: %SYSEVALF function has no expression to evaluate.
14 |a^c|
15 
16This macro uses the PARMBUFF option to accept a virtually unlimited number
17of inputs. It then uses %QSCAN() to pull out the delimiter and loops over
18the other items emitting them when not empty.
19 
20Examples:
21 
22%* Examples matching CATX() example ;
23%put |%qcatx(^,A,B,C,D)| Expect: |A^B^C^D| ;
24%put |%qcatx(^,E,,F,G)| Expect: |E^F^G|;
25%put |%qcatx(^,H,,J)| Expect: |H^J| ;
26 
27%* Spaces are preserved in delimiter but not other items ;
28 
29%put |%qcatx(^, a ,b , c)| Expect: |a^b^c|;
30%put |%qcatx( ,a,b,c)| Expect: |a b c|;
31 
32%* You can use either single or double quotes to protect commas.;
33%* The quotes are kept as part of the values.;
34 
35%put |%qcatx(^,a,'b,b',c)| Expect: |a^'b,b'^c|;
36%put |%qcatx(",",a,b)| Expect: |a","b|;
37 
38---------------------------------------------------------------------------*/
39%local dlm i prefix item;
40/*---------------------------------------------------------------------------
41SYSPBUFF must have at least 5 characters, like (a,b), for any results to be
42produced. First remove () from around SYSPBUFF. Then take first value as
43the delimiter. Loop over rests of items. When not empty emit the item.
44Use of prefix macro variable enables only writing delimiter between items.
45---------------------------------------------------------------------------*/
46%IF %LENGTH(&syspbuff)>4 %THEN %DO;
47 %let syspbuff=%qsubstr(&syspbuff,2,%LENGTH(&syspbuff)-2);
48 %let dlm=%qscan(&syspbuff,1,%str(,),mq);
49 %DO i=2 %to %sysfunc(countw(&syspbuff,%str(,),mq));
50 %let item=%qsysfunc(strip(%qscan(&syspbuff,&i,%str(,),mq)));
51 %IF %LENGTH(&item) %THEN %DO;
52 %*;&prefix.&item.
53 %let prefix=&dlm.;
54 %END;
55 %END;
56%END;
57%mend qcatx;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Banner
Le Conseil de l'Expert
Expert
Stéphanie
Spécialiste Machine Learning et IA.
« La gestion des chaînes de caractères au sein du langage macro SAS cache souvent une complexité sous-estimée, notamment lorsque l'on utilise %SYSFUNC(CATX(...)). Le problème fondamental réside dans la tentative de SAS d'évaluer dynamiquement le type (numérique ou caractère) des arguments, ce qui génère fréquemment des erreurs de type SYSEVALF ou des masquages involontaires de caractères spéciaux. Cette macro %QCATX est une solution d'ingénierie logicielle robuste pour pallier ces limitations.

Cette macro est un "must-have" dans toute bibliothèque utilitaire d'entreprise. Elle est particulièrement précieuse pour construire dynamiquement des clauses WHERE ou des listes de variables dans des codes SQL générés par macro, où la présence de caractères spéciaux est fréquente. »