Publié le :
Macro CREATION_INTERNE

Compter les chaînes de caractères entre guillemets

Cette macro analyse une chaîne de caractères fournie en entrée pour y dénombrer les sous-chaînes encadrées par des guillemets. Elle fonctionne de manière itérative : à chaque passe, elle recherche la première paire de guillemets, incrémente un compteur, puis supprime la sous-chaîne trouvée (y compris les guillemets) avant de relancer l'analyse sur la chaîne restante. Ce processus se répète jusqu'à ce qu'il n'y ait plus de chaînes entre guillemets à trouver. La macro retourne la valeur finale du compteur.
Analyse des données

Type : CREATION_INTERNE


La macro ne traite aucun jeu de données. Elle opère exclusivement sur une chaîne de caractères textuelle passée en paramètre. Aucune donnée n'est lue depuis une source externe ou SASHELP.

1 Bloc de code
Macro
Explication :
Ce bloc définit la macro 'quotecnt' qui prend une chaîne de caractères 'str' en paramètre. Une boucle, labellisée '%redo:', est utilisée pour parcourir la chaîne. À l'intérieur, une boucle '%do' recherche les positions du premier guillemet ouvrant ('pos1') et du guillemet fermant correspondant ('pos2'). Une fois la paire trouvée, le compteur 'count' est incrémenté et la sous-chaîne correspondante est retirée de la chaîne de traitement 'tempstr' à l'aide de la fonction '%qsubstr'. La commande '%goto redo' relance l'analyse sur la chaîne modifiée. Le processus s'arrête lorsque plus aucune paire de guillemets n'est trouvée. La macro retourne alors le nombre total de paires comptées.
Copié !
1/*<pre><b>
2/ Program : quotecnt.sas
3/ Version : 1.0
4/ Author : Roland Rashleigh-Berry
5/ Date : 04-May-2011
6/ Purpose : Function-style macro to count quoted strings in a macro expression
7/ SubMacros : none
8/ Notes : This returns the number of quoted strings.
9/ Usage : %let count=%quotecnt(&str);
10/
11/===============================================================================
12/ PARAMETERS:
13/-------name------- -------------------------description------------------------
14/ str (pos) String
15/===============================================================================
16/ AMENDMENT HISTORY:
17/ init --date-- mod-id ----------------------description------------------------
18/ rrb 29Mar07 Put out "macro called" message and header tidy
19/ rrb 30Jul07 Header tidy
20/ rrb 04May11 Code tidy
21/===============================================================================
22/ This is public domain software. No guarantee as to suitability or accuracy is
23/ given or implied. User uses this code entirely at their own risk.
24/=============================================================================*/
25 
26%put MACRO CALLED: quotecnt v1.0;
27 
28%macro quotecnt(str);
29 
30 %local i pos1 pos2 qtype tempstr count;
31 %let tempstr=&str;
32 %let count=0;
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 %let count=%eval(&count + 1);
55 %IF (&pos1 GT 1) and (&pos2 LT %LENGTH(&tempstr)) %THEN
56 %let tempstr=%qsubstr(&tempstr,1,&pos1-1)%qsubstr(&tempstr,&pos2+1);
57 %ELSE %IF (&pos1 EQ 1) and (&pos2 LT %LENGTH(&tempstr)) %THEN
58 %let tempstr=%qsubstr(&tempstr,&pos2+1);
59 %IF (&pos1 GT 1) and (&pos2 EQ %LENGTH(&tempstr)) %THEN
60 %let tempstr=%qsubstr(&tempstr,1,&pos1-1);
61 %ELSE %IF (&pos1 EQ 1) and (&pos2 EQ %LENGTH(&tempstr)) %THEN
62 %let tempstr=;
63 %IF %LENGTH(&tempstr) %THEN %goto redo;
64 %END;
65 
66&count
67 
68%mend quotecnt;
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.