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 | /*<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; |