I am trying to write a program that will check, and transform character strings into Valid variable names. As ValidVarName=V7 does upon import, replacing all invalid characters with underscores.
I have the following, and so far it appears to work. However if the string contains % or &... It will run, and replace those characters with _ , but not before outputting numerous Warnings for apparent invocation of macro not resolved, and apparent symbolic reference not resolved.
Any ideas of how to quote out those attempts to resolve them?
*Testing Table;
data Testing1;
infile datalines delimiter=',';
LEngth A $ 20;
input A $ B $;
datalines;
?D%a-v#e's N(a*m!e, a&b"c"
item1, item2
;
run;
*Transpose so COL1 contains Wanted Strings;
proc transpose data=testing1 out=testing1;
var A B;
run;
*Select COL1 into VarNames with no leading or trailing spaces;
proc sql noprint;
select Strip(Col1) into :VarNames
separated by '|'
from Testing1;
quit;
*Replace spaces, and single/double quotes with Underscores;
%LET VarNames = %SYSFUNC(TRANSLATE(%NRBQUOTE(&VarNames.),___,%STR( )%STR(%')%STR(%")));
%PUT VarNames=%NRBQUOTE(&VarNames.);
*VNum= number of elements in VarNames;
%LET VNum=%SYSFUNC(CountW(%NRBQUOTE(&VarNames.),|));
%PUT VNum=&VNum.;
%MACRO CheckV7();
%DO L=1 %TO &VNum.;
*Select Lth element of Varnames as NameCheck;
%LET NameCheck=%SCAN(%NRBQUOTE(&VarNames.),&L.,|);
%PUT NameCheck=%NRBQUOTE(&Namecheck);
*If NameCheck is not a valid Variable Name, then;
%IF %SYSFUNC(NVALID(%NRBQUOTE(&NameCheck.),V7))=0 %THEN
%DO;
*Repeat until NameCheck is a valid Variable Name;
%DO %UNTIL(%SYSFUNC(NVALID(%NRBQUOTE(&NameCheck.),V7))=1);
*InvSpot = position of first invalid character;
%Let InvSpot = %SYSFUNC(NOTNAME(%NRBQUOTE(&NameCheck.)));
%PUT InvSpot=&InvSpot.;
*replace invalid character with underscore;
%LET NameCheck= %SYSFUNC(TRANSLATE(%NRBQUOTE(&NameCheck.),_,%NRBQUOTE(%SUBSTR(%NRBQUOTE(&NameCheck.),&InvSpot.,1))));
%PUT NameCheck=&NameCheck.;
%END;
%END;
%GLOBAL STRING&L.;
%LET String&L.=&NameCheck.;
%END;
%MEND CheckV7;
%CheckV7();
%PUT String1=&String1. String2=&String2.;
I recently posted two other questions regarding this topic.
https://communities.sas.com/t5/SAS-Programming/function-to-change-character-strings-into-acceptable-variable/m-p/714219#M220472
https://communities.sas.com/t5/New-SAS-User/Help-With-NRSTR-code/m-p/714378#M27293
... View more