Publié le :
Macro CREATION_INTERNE

Macro noquotes

Cette macro analyse une chaîne de caractères fournie en paramètre et identifie toutes les portions de texte entourées de guillemets simples ou doubles. Elle supprime ensuite ces portions entre guillemets de la chaîne, renvoyant uniquement le texte restant. Le processus est itératif, garantissant que toutes les occurrences de chaînes entre guillemets sont supprimées.
Analyse des données

Type : CREATION_INTERNE


La macro opère sur une chaîne de caractères ('str') fournie directement en paramètre d'entrée, ne nécessitant pas de source de données externe ni de jeu de données SAS.

1 Bloc de code
MACRO DÉFINITION
Explication :
Ce bloc définit la macro fonctionnelle `noquotes` qui prend une chaîne de caractères en entrée (`str`).
1. **Initialisation**: Des variables locales (`i`, `pos1`, `pos2`, `qtype`, `tempstr`) sont déclarées. `tempstr` est initialisée avec la chaîne d'entrée.
2. **Boucle de Recherche (`%redo`)**: La macro entre dans une boucle pour rechercher et supprimer les chaînes entre guillemets.
* `pos1` et `pos2` sont réinitialisés à 0 pour chaque itération, et `qtype` est vidé.
* Une boucle `%do` parcourt `tempstr` caractère par caractère.
* Elle détecte le premier guillemet (simple ou double) et stocke sa position dans `pos1` et son type dans `qtype`.
* Une fois le guillemet ouvrant trouvé, elle cherche le guillemet fermant correspondant de même type et stocke sa position dans `pos2`.
3. **Suppression**: Si un couple de guillemets est trouvé (`pos1 > 0` et `pos2 > 0`):
* La chaîne `tempstr` est reconstruite en concaténant la partie avant le guillemet ouvrant et la partie après le guillemet fermant, excluant ainsi la chaîne entre guillemets.
* La fonction `%qsubstr` est utilisée pour gérer les caractères spéciaux dans les sous-chaînes.
* Si la `tempstr` résultante n'est pas vide, la macro revient à l'étape `redo` pour rechercher d'autres chaînes entre guillemets.
4. **Retour**: Une fois toutes les chaînes entre guillemets supprimées, la macro retourne la valeur finale de `tempstr`.
Copié !
1/*<pre><b>
2/ Program : noquotes.sas
3/ Version : 1.0
4/ Author : Roland Rashleigh-Berry
5/ Date : 04-May-2011
6/ Purpose : Function-style macro to remove all quoted strings from a macro
7/ expression.
8/ SubMacros : none
9/ Notes : This gets rid of all quoted strings and returns what is left.
10/ Usage : %let noquotes=%noquotes(&str);
11/
12/===============================================================================
13/ PARAMETERS:
14/-------name------- -------------------------description------------------------
15/ str (pos) String
16/===============================================================================
17/ AMENDMENT HISTORY:
18/ init --date-- mod-id ----------------------description------------------------
19/ rrb 29Mar07 Put out "macro called" message plus header tidy
20/ rrb 30Jul07 Header tidy
21/ rrb 04May11 Code tidy
22/===============================================================================
23/ This is public domain software. No guarantee as to suitability or accuracy is
24/ given or implied. User uses this code entirely at their own risk.
25/=============================================================================*/
26 
27%put MACRO CALLED: noquotes v1.0;
28 
29%macro noquotes(str);
30 
31 %local i pos1 pos2 qtype tempstr;
32 %let tempstr=&str;
33 
34 %redo:
35 
36 %let pos1=0;
37 %let pos2=0;
38 %let qtype=;
39 
40 %DO i=1 %to %LENGTH(&tempstr);
41 %IF &pos1 EQ 0 %THEN %DO;
42 %IF %qsubstr(&tempstr,&i,1) EQ %str(%' )
43 or %qsubstr(&tempstr,&i,1) EQ %str(%" ) %THEN %DO;
44 %let pos1=&i;
45 %let qtype=%qsubstr(&tempstr,&i,1);
46 %END;
47 %END;
48 %ELSE %IF (&pos1 GT 0) and (&pos2 EQ 0) %THEN %DO;
49 %IF %qsubstr(&tempstr,&i,1) EQ %str(&qtype) %THEN %let pos2=&i;
50 %END;
51 %END;
52 
53 %IF (&pos1 GT 0) and (&pos2 GT 0) %THEN %DO;
54 %IF (&pos1 GT 1) and (&pos2 LT %LENGTH(&tempstr)) %THEN
55 %let tempstr=%qsubstr(&tempstr,1,&pos1-1)%qsubstr(&tempstr,&pos2+1);
56 %ELSE %IF (&pos1 EQ 1) and (&pos2 LT %LENGTH(&tempstr)) %THEN
57 %let tempstr=%qsubstr(&tempstr,&pos2+1);
58 %IF (&pos1 GT 1) and (&pos2 EQ %LENGTH(&tempstr)) %THEN
59 %let tempstr=%qsubstr(&tempstr,1,&pos1-1);
60 %ELSE %IF (&pos1 EQ 1) and (&pos2 EQ %LENGTH(&tempstr)) %THEN
61 %let tempstr=;
62 %IF %LENGTH(&tempstr) %THEN %goto redo;
63 %END;
64 
65&tempstr
66 
67%mend noquotes;
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 : This is public domain software. No guarantee as to suitability or accuracy is given or implied. User uses this code entirely at their own risk.