Publié le :
Macro EXTERNE

Nettoyage de caractères spéciaux

Cette macro, `stnd_specialchar`, prend trois paramètres : `nm_in` (la variable d'entrée à nettoyer), `nm_out` (la variable de sortie nettoyée) et `typ` (un indicateur pour un traitement spécifique si la valeur est 'NAME'). Le traitement commence par initialiser une variable temporaire `__nm`. Si certaines variables de contrôle (`sql21`, `sql22`, `sql23`) sont à zéro, aucun nettoyage n'est effectué. Sinon, le processus inclut la suppression des guillemets, la gestion spécifique des noms (si `typ`='NAME' et `sql21` est actif, des remplacements sont effectués via `pcola21`/`pcolb21`), l'ajout d'espaces autour des esperluettes, la suppression de caractères définis par `pcola22`, et la traduction de caractères spécifiés par `pcola23` et des points en espaces. La chaîne est ensuite compactée et attribuée à `nm_out`. Si le nettoyage résulte en une chaîne vide, la variable `nm_out` conserve sa valeur originale (`nm_in`).
Analyse des données

Type : EXTERNE


La macro opère sur une variable d'entrée (`nm_in`) qui est passée en paramètre, ce qui signifie que les données sur lesquelles elle agit proviennent de l'environnement d'exécution appelant la macro. Elle n'accède pas directement à des tables SASHELP ni ne crée ses propres jeux de données internes. Des variables macro globales (`sql21`, `sql22`, `sql23`, `pcola21`, `pcolb21`, `pcola22`, `pcola23`) sont utilisées pour configurer les règles de nettoyage, ces variables étant également attendues d'un contexte externe à la macro.

1 Bloc de code
Logique DATA STEP au sein de la macro
Explication :
Ce bloc définit la macro `stnd_specialchar`. Il déclare une variable temporaire `__nm` avec une longueur déterminée par `&lng.`. Le cœur de la logique est conditionnel : si les variables macro `&sql21.`, `&sql22.`, `&sql23.` sont toutes à zéro, la variable `__nm` reste vide, évitant ainsi le nettoyage. Sinon, la variable d'entrée `&nm_in.` est d'abord traitée : les espaces multiples sont compactés (`compbl`), les guillemets doubles sont supprimés (`compress`). Si le paramètre `typ` est 'NAME' et `&sql21.` n'est pas nul, une boucle (`%do j=1 %to &sql21.`) applique des remplacements spécifiques via `transtrn` en utilisant des paires de variables macro `&&pcola21_&j.` et `&&pcolb21_&j.`. L'esperluette ('&') est ensuite encadrée d'espaces (`tranwrd`). Deux autres boucles conditionnelles (`%if &sql22. ne 0 %then %do k=1 %to &sql22.;` et `%if &sql23. ne 0 %then %do m=1 %to &sql23.;`) utilisent `compress` et `translate` pour supprimer ou remplacer d'autres ensembles de caractères spécifiés par `&&pcola22_&k.` et `&&pcola23_&m.`. Enfin, le caractère point ('.') est explicitement remplacé par un espace. La variable `__nm` est compactée à nouveau et assignée à `&nm_out.`. Si `__nm` est vide après tout traitement, `&nm_out.` conserve la valeur originale de `&nm_in.`. La variable temporaire `__nm` est supprimée via l'instruction `drop __: ;`.
Copié !
1%macro stnd_specialchar(nm_in,nm_out,typ);
2/* syntax:
3 (1) name of variable needing special chars removed
4 (2) output variable name without special chars
5 (3) if typ is 'name', then use pattern file 21, otherwise, don't
6*/
7 
8 LENGTH __nm $&lng.;
9 
10 %IF &sql21.=0 and &sql22.=0 and &sql23.=0 %THEN %DO;
11 __nm='';
12 %END;
13 %ELSE %DO;
14 __nm=strip(compbl(&nm_in.));
15 __nm=compress(__nm,"%str(%")"); *** remove double quote ***;
16 %if %upcase("&typ")="NAME" %then %do; *** handle special firm name cases ***;
17 %if &sql21. ne 0 %then %do j=1 %to &sql21.; __nm=transtrn(__nm,"&&pcola21_&j.","&&pcolb21_&j."); %end;
18 %end;
19 __nm=tranwrd(__nm,"&"," & "); *** surround & with spaces ***;
20 
21 %if &sql22. ne 0 %then %do k=1 %to &sql22.; __nm=compress(__nm,"&&pcola22_&k."); %end;
22 %if &sql23. ne 0 %then %do m=1 %to &sql23.; __nm=translate(__nm," ","%str(&&pcola23_&m.)"); %end;
23 
24 *** SAS doesn,t read period correctly from parameter file so handle here ***;
25 __nm=translate(__nm," ","%str(.)");
26 __nm=strip(compbl(__nm));
27 
28 %end;
29 
30 if __nm~="" THEN &nm_out.=__nm; ELSE &nm_out=&nm_in.;
31 drop __: ;
32 
33%mend;
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.
Informations de Copyright : Copyright 2016 Nada Wasi, Ann Rodgers, Kristin McCue. Ce fichier fait partie de %stnd_compname et est distribué sous les termes de la licence publique générale GNU version 3 ou ultérieure. Sans garantie. Contact : Ann Rodgers, anrodger@umich.edu, University of Michigan.