Type : CREATION_INTERNE
Das Makro verarbeitet eine als Eingabeargument bereitgestellte Zeichenkettenliste; es liest keine Daten aus externen Dateien oder SAS-Bibliotheken.
| 1 | /* |
| 2 | / Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. |
| 3 | / SPDX-License-Identifier: Apache-2.0 |
| 4 | / |
| 5 | / Program : NoDup.sas |
| 6 | / Author : Noah Powers |
| 7 | / Created : 2019 |
| 8 | / Purpose : Function-style macro to remove duplicates in a space-delimited list |
| 9 | / Usage : %let str=%nodup(aaa bbb aaa) |
| 10 | / Notes : |
| 11 | /============================================================================================ |
| 12 | / Parameters Usage |
| 13 | / ------------------------------------------------------------------------------------- |
| 14 | / Name Description |
| 15 | / ------------------------------------------------------------------------------------- |
| 16 | / list (positional) space delimited list of items to de-dup |
| 17 | / casesens Y/N Flag to make process case sensitive or not |
| 18 | /============================================================================================*/ |
| 19 | %macro nodup(list,casesens=N); |
| 20 | |
| 21 | %local i j match item NumItems ; |
| 22 | |
| 23 | %IF not %LENGTH(&casesens.) %THEN %let casesens = N ; |
| 24 | %let casesens = %upcase(%substr(&casesens.,1,1)); |
| 25 | %let NumItems = %words(&list.) ; |
| 26 | |
| 27 | %DO i = 1 %to &NumItems. ; |
| 28 | %let item = %scan(&list.,&i.,%str( )); |
| 29 | %let match = N ; |
| 30 | %IF (&i. < &NumItems.) %THEN %DO j = %eval(&i. + 1) %to &NumItems. ; |
| 31 | %IF (&casesens. = Y) %THEN %DO; |
| 32 | %IF "&item." = "%scan(&list.,&j.,%str( ))" %THEN %let match = Y ; |
| 33 | %END; |
| 34 | %ELSE %DO; |
| 35 | %IF "%upcase(&item.)" = "%upcase(%scan(&list.,&j.,%str( )))" %THEN %let match = Y ; |
| 36 | %END; |
| 37 | %END; |
| 38 | |
| 39 | %IF (&match. = N) %THEN &item. ; |
| 40 | %END; |
| 41 | |
| 42 | %mend ; |