Hello,
Please advise.
%let exception=b_n1h1 c_n1h1 f_n1h1 m_n1h1;
%let have=(n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) +
(e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]);I want a list of all values(anything that has an underscore) from 'have' that are NOT in 'exception'
want==n1h2_output n1h1_n1h2 a_n1h1 d_n1h1 e_n1h1 g_n1h1Thank You
Hi @david27 Please see if this works. I just took a quick stab at your string with some easy assumptions-
%let exception=b_n1h1 c_n1h1 f_n1h1 m_n1h1;
%let have=(n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) +
(e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]);
data have;
have="&have";
run;
data want;
set have;
array ex(4)$30 _temporary_('b_n1h1' 'c_n1h1' 'f_n1h1' 'm_n1h1');
do _n_=1 to countw(have,'*');
w=scan(have,_n_,'*');
want=scan(w,-1);
if index(want,'_') and want not in ex then output;
end;
drop w;
run;
| have | want |
|---|---|
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | n1h2_output |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | n1h1_n1h2 |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | a_n1h1 |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | d_n1h1 |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | e_n1h1 |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | g_n1h1 |
Hi @david27 Please see if this works. I just took a quick stab at your string with some easy assumptions-
%let exception=b_n1h1 c_n1h1 f_n1h1 m_n1h1;
%let have=(n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) +
(e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]);
data have;
have="&have";
run;
data want;
set have;
array ex(4)$30 _temporary_('b_n1h1' 'c_n1h1' 'f_n1h1' 'm_n1h1');
do _n_=1 to countw(have,'*');
w=scan(have,_n_,'*');
want=scan(w,-1);
if index(want,'_') and want not in ex then output;
end;
drop w;
run;
| have | want |
|---|---|
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | n1h2_output |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | n1h1_n1h2 |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | a_n1h1 |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | d_n1h1 |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | e_n1h1 |
| (n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) + (e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]) | g_n1h1 |
Thank You for the code @novinosrin
Can this be done without a datastep?
Also not sure if this helps but,
the string that i am looking for
Hi @david27 "Without a datastep makes it more a heavier syntax in my opinion-
options minoperator mindelimiter=' ';
%macro t;
%global want;
%let want=;
%let exception=b_n1h1 c_n1h1 f_n1h1 m_n1h1;
%let have=(n1h2_output*((n1h1_n1h2*((a_n1h1*a[i]-b[1]) + (b_n1h1*b[i]-b[1]) + (c_n1h1*c[i]-b[1]) + (d_n1h1*d[i]-b[1]) +
(e_n1h1*e[i]-b[1]) + (f_n1h1*f[i]-b[1]) + (g_n1h1*g[i]-b[1]))-b[2]);
%do i=1 %to %sysfunc(countw(%bquote(&have),%str(*)));
%let w=%scan(%bquote(&have),&i,%str(*));
%let need=%scan(%bquote(&w),-1);
%put &=need;
%if %index(&need,%str(_))>0 and %eval(&need in (&exception))=0 %then %let want=&want &need;
%end;
%mend t;
%t
%put &=want;
LOG:
%put &=want;
WANT=n1h2_output n1h1_n1h2 a_n1h1 d_n1h1 e_n1h1 g_n1h1
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
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.
Ready to level-up your skills? Choose your own adventure.