- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
I would like to know how to use substr function with macro variables. I have the macro variables as follows and I would like to look for first five characters and select the last three characters based on the condition as mentioned below. Not sure it is right and I do not have SAS to execute to it (downtime now). Correct me if I'm wrong.
%let ent_curr=10000_EUR; /*i have many macro variables like this*/
/*and I have to write the condition as like below*/
/*given below is sample condition and there are some conditions as similar which I have to write*/
Case
When entity =substr(&ent_curr.,1,5) then substr(&ent_curr.,7,9)
Else
Currency_cd
End;
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
SUBSTR works on a text string
substr(&ent_curr.,1,5)
tells SAS to use the text string value of variable by the name of &ENT_CURR, which resolves to the text string value of the variable named 10000_EUR, but the variable named 10000_EUR doesn't exist.
To make SUBSTR work on a text string and not the value of a variable, you have to enclose &ENT_CURR in ______________________. (Answer to be provided by the user)
Paige Miller
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
help me with one example which works for my scenario?
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
@Babloo wrote:
I don't understand the second part of your explanation. Could you please
help me with one example which works for my scenario?
I strongly suggest that you start making use of the tool that sits between your ears. The answer to @PaigeMiller's exercise is DEAD SIMPLE.
Especially for someone who's been around here for ~1000 posts and probably seen it tens of times in our answers to previous questions.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
To help you we need to know the types of the ENTITY and CURRENCY_CD variables.
Assuming the first is numeric and the second is character you want to do this, using the macro function %SUBSTR() instead of the SAS function SUBSTR(). So when ENT_CURR is 10000_EUR then this code:
case when entity=%substr(&ent_curr.,1,5) then "%substr(&ent_curr.,7,9)"
else Currency_cd
end
Will generate this SAS code:
case when entity=10000 then "EUR"
else Currency_cd
end
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Always do the text replacement to see what would happen and if it's valid code.
Case When entity =substr(10000_EUR,1,5) then substr(10000_EUR,7,9) Else Currency_cd End;
You can see the above would not be valid code.
To make it valid you can add quotes around the macro variable so it's treated as text.
Case When entity =substr("10000_EUR",1,5) then substr("10000_EUR",7,9) Else Currency_cd End;
And then replace the quotes around your macro variable to finish the correction.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi @Babloo,
Just to add: The third argument of the SUBSTR and %SUBSTR functions is the length of the substring to extract, not the position of the last character of the substring (although it is tempting to think so). Hence, it should be 3 in your second function call, not 9 (which would be invalid, although not refused). Or you can simply omit the third argument to extract the rest of the string (from starting position 7).
Actually, in your example I'd rather use SCAN (or %SCAN) because it doesn't make assumptions about lengths of substrings.