BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
jins
Fluorite | Level 6

 

I am trying a scenario where a data set with variable names can accept all these special characters and these variables pass through macro variable for further processing. 

 

~ ` ! @ # $ % ^ & ( ) _ + = { } [ ] ; ' ,

 

For example, i created this exhaustive list of all special characters separated by letter 'u'. Is this possible at all? 

Also, i am using the VALIDVARNAME=ANY options in SAS.

 

%let subject=u~u`u!u@u#u$u%u^u&u(u)u_u+u=u{u}u[u]u;u'u,

proc sort data=data1 out=data2 nodupkey;
by &subject;
run;

1 ACCEPTED SOLUTION

Accepted Solutions
Kurt_Bremser
Super User

Instead of having to use complicated programming that is hard to maintain and error-prone, get rid of the non-standard variable names as soon as the data is imported into SAS, and keep the original names in labels. LABELS are the place for fancy strings.

View solution in original post

5 REPLIES 5
ed_sas_member
Meteorite | Level 14

Hi @jins ,

 

You can use the function %nrstr() to hide special characters. Don't forget to add a % before characters that generally occur by pairs such as ' or ".

 

Hope this help!

 

%let subject=%nrstr(u~u`u!u@u#u$u%u^u&u(u)u_u+u=u{u}u[u]u;u%'u,);
Kurt_Bremser
Super User

Instead of having to use complicated programming that is hard to maintain and error-prone, get rid of the non-standard variable names as soon as the data is imported into SAS, and keep the original names in labels. LABELS are the place for fancy strings.

ed_sas_member
Meteorite | Level 14

Hi @jins ,

 

If you found one of the answers to be the solution for you then please mark it as solution so we know you've got your answer. Marking something as solution will also help others who search the forums later on to get answers to similar problems.

 

Thanks

gamotte
Rhodochrosite | Level 12

Hello,

 

According to the documentation, with validvarname=any, you are limited to 32 characters anyway

so your example, for instance, could not work.

 

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000279245.htm

 

When using an unconventional variable name, you have to quote it as 'var name'n or "var name"n.

Use the latter if you want macrovariables between quotes to be resolved.

 

Here is an example without characters % and & to avoid dealing with unwanted macro resolutions.

 

option validvarname=ANY;

data have;
input "@u#u$u^u(u)u{u}u[u]u;u'u,"n;
cards;
1
2
3
0
;
run;

data _NULL_;
    call symputx("subject","@u#u$u^u(u)u{u}u[u]u;u'u,");
run;

proc sort data=have out=want; 
    by "&subject."n; 
run;

The best solution being following @Kurt_Bremser's advice and rename your variables to standard names as soon as possible.

Tom
Super User Tom
Super User

Are the strange characters part of the variable NAME or the VALUE?

For a name you need to use name literals. 

%let subject= 'a@b'n;

To make it easier use the NLITERAL() function.

call symputx('subject',nliteral(_name_));

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!

Submit your idea!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 5 replies
  • 697 views
  • 5 likes
  • 5 in conversation