Hello,
I have this macro variable:
and I am trying to extract "ITERATIONS=10", is there any way to do that?
Macro is from proc optmodel
Please let me know if you need any other info.
@jamal01 wrote:
The pair that begins with ITERATIONS
%let mvar=GLOBAL _OROPTMODEL_ STATUS=OK ALGORITHM=IP SOLUTION_STATUS=OPTIMAL OBJECTIVE=4482560894.6 PRIMAL_INFEASIBILITY=2.495295E-16 DUAL_INFEASIBILITY=9.21096E-19 BOUND_INFEASIBILITY=0 DUALITY_GAP=1.252394E-11 COMPLEMENTARITY=0 ITERATIONS=10 PRESOLVE_TIME=0.00 SOLUTION_TIME=0.02;
data _null_;
where=find("&mvar",'ITERATIONS');
want=scan(substr("&mvar",where),2,'= ');
call symputx('want',want);
run;
%put &=want;
We generally can't work from screen captures. Please, in the future, provide data as text.
What do you mean by you want to extract "ITERATIONS=10" from the macro variable? If you already know you want ITERATIONS=10, there's no need to extract it. Do you mean something else? Do you mean you want to extract the n-th data pair? Do you mean you want the data pair that begins with ITERATIONS?
Sorry, here is the data:
GLOBAL _OROPTMODEL_ STATUS=OK ALGORITHM=IP SOLUTION_STATUS=OPTIMAL OBJECTIVE=4482560894.6 PRIMAL_INFEASIBILITY=2.495295E-16
DUAL_INFEASIBILITY=9.21096E-19 BOUND_INFEASIBILITY=0 DUALITY_GAP=1.252394E-11 COMPLEMENTARITY=0 ITERATIONS=10 PRESOLVE_TIME=0.00
SOLUTION_TIME=0.02
Right, I can see that ITERATIONS=10 in the macro, but I was trying to write a small put statement and display something along the lines of "The number of iterations is 10".
So, are you looking for:
The pair that begins with ITERATIONS
@jamal01 wrote:
The pair that begins with ITERATIONS
%let mvar=GLOBAL _OROPTMODEL_ STATUS=OK ALGORITHM=IP SOLUTION_STATUS=OPTIMAL OBJECTIVE=4482560894.6 PRIMAL_INFEASIBILITY=2.495295E-16 DUAL_INFEASIBILITY=9.21096E-19 BOUND_INFEASIBILITY=0 DUALITY_GAP=1.252394E-11 COMPLEMENTARITY=0 ITERATIONS=10 PRESOLVE_TIME=0.00 SOLUTION_TIME=0.02;
data _null_;
where=find("&mvar",'ITERATIONS');
want=scan(substr("&mvar",where),2,'= ');
call symputx('want',want);
run;
%put &=want;
This is what my log is looking like when I try to run it:
1 The SAS System 18:06 Wednesday, November 30, 2022 1 ;*';*";*/;quit;run; 2 OPTIONS PAGENO=MIN; 3 %LET _CLIENTTASKLABEL='Program'; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 4 %LET _CLIENTPROCESSFLOWNAME='Standalone Not In Project'; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 5 %LET _CLIENTPROJECTPATH=''; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 6 %LET _CLIENTPROJECTPATHHOST=''; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 7 %LET _CLIENTPROJECTNAME=''; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 8 %LET _SASPROGRAMFILE=''; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 9 %LET _SASPROGRAMFILEHOST=''; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 10 11 ODS _ALL_ CLOSE; 12 OPTIONS DEV=SVG; 13 GOPTIONS XPIXELS=0 YPIXELS=0; 14 %macro HTML5AccessibleGraphSupported; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 15 %if %_SAS_VERCOMP_FV(9,4,4, 0,0,0) >= 0 %then ACCESSIBLE_GRAPH; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 16 %mend; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 17 FILENAME EGHTML TEMP; 18 ODS HTML5(ID=EGHTML) FILE=EGHTML 2 The SAS System 18:06 Wednesday, November 30, 2022 19 OPTIONS(BITMAP_MODE='INLINE') 20 %HTML5AccessibleGraphSupported _ 22 200 ERROR 22-322: Syntax error, expecting one of the following: ;, ACCESSIBLE_GRAPH, ANCHOR, ARCHIVE, ATTRIBUTES, BASE, BODY, BOX_SIZING, CHARSET, CLOSE, CODE, CODEBASE, CONTENTS, CSS, CSSSTYLE, DOM, DPI, ENCODING, EVENT, FILE, FRAME, GFOOTNOTE, GPATH, GTITLE, HEADTEXT, IMAGE_DPI, METATEXT, NEWFILE, NOACCESSIBLE_GRAPH, NOGFOOTNOTE, NOGTITLE, OPTIONS, PACKAGE, PAGE, PARAMETERS, PATH, RECORD_SEPARATOR, SGE, STYLE, STYLESHEET, TEXT, TRANTAB. ERROR 200-322: The symbol is not recognized and will be ignored. 21 ENCODING='utf-8' 22 STYLE=HtmlBlue 23 NOGTITLE 24 NOGFOOTNOTE 25 GPATH=&sasworklocation _ 22 200 ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string. ERROR 200-322: The symbol is not recognized and will be ignored. 26 ; 27 28 %let mvar=GLOBAL _OROPTMODEL_ STATUS=OK ALGORITHM=IP SOLUTION_STATUS=OPTIMAL OBJECTIVE=4482560894.6 _ 180 28 ! PRIMAL_INFEASIBILITY=2.495295E-16 DUAL_INFEASIBILITY=9.21096E-19 BOUND_INFEASIBILITY=0 DUALITY_GAP=1.252394E-11 28 ! COMPLEMENTARITY=0 ITERATIONS=10 PRESOLVE_TIME=0.00 SOLUTION_TIME=0.02; ERROR 180-322: Statement is not valid or it is used out of proper order. 29 30 data _null_; 31 where=find("&mvar",'ITERATIONS'); 32 want=scan(substr("&mvar",where),2,'= '); 33 call symputx('want',want); 34 run; ERROR: Invalid second argument to function SUBSTR at line 32 column 15. where=0 want= _ERROR_=1 _N_=1 35 %put &=want; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 36 37 %LET _CLIENTTASKLABEL=; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 38 %LET _CLIENTPROCESSFLOWNAME=; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 39 %LET _CLIENTPROJECTPATH=; _ 180 3 The SAS System 18:06 Wednesday, November 30, 2022 ERROR 180-322: Statement is not valid or it is used out of proper order. 40 %LET _CLIENTPROJECTPATHHOST=; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 41 %LET _CLIENTPROJECTNAME=; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 42 %LET _SASPROGRAMFILE=; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 43 %LET _SASPROGRAMFILEHOST=; _ 180 ERROR 180-322: Statement is not valid or it is used out of proper order. 44 45 ;*';*";*/;quit;run; 46 ODS _ALL_ CLOSE; 47 48 49 QUIT; RUN; 50
Any idea why this might be happening?
Save your data sets, exit from SAS, re-launch SAS and try it again
So if you have this string
GLOBAL _OROPTMODEL_ STATUS=OK ALGORITHM=IP SOLUTION_STATUS=OPTIMAL OBJECTIVE=4482560894.6 PRIMAL_INFEASIBILITY=2.495295E-16 DUAL_INFEASIBILITY=9.21096E-19 BOUND_INFEASIBILITY=0 DUALITY_GAP=1.252394E-11 COMPLEMENTARITY=0 ITERATIONS=10 PRESOLVE_TIME=0.00 SOLUTION_TIME=0.02
It looks like is a series of name=value pairs delimited by spaces.
%let string=
GLOBAL _OROPTMODEL_ STATUS=OK ALGORITHM=IP SOLUTION_STATUS=OPTIMAL OBJECTIVE=4482560894.6 PRIMAL_INFEASIBILITY=2.495295E-16
DUAL_INFEASIBILITY=9.21096E-19 BOUND_INFEASIBILITY=0 DUALITY_GAP=1.252394E-11 COMPLEMENTARITY=0 ITERATIONS=10 PRESOLVE_TIME=0.00
SOLUTION_TIME=0.02
;
data want;
length index 8 name $32 value $32;
length string $32767 ;
string=symget('string');
do index=1 to countw(string,' ');
name = scan(scan(string,index,' '),1,'=');
value = scan(scan(string,index,' '),2,'=');
output;
end;
drop string;
run;
Result:
Obs index name value 1 1 GLOBAL 2 2 _OROPTMODEL_ 3 3 STATUS OK 4 4 ALGORITHM IP 5 5 SOLUTION_STATUS OPTIMAL 6 6 OBJECTIVE 4482560894.6 7 7 PRIMAL_INFEASIBILITY 2.495295E-16 8 8 DUAL_INFEASIBILITY 9.21096E-19 9 9 BOUND_INFEASIBILITY 0 10 10 DUALITY_GAP 1.252394E-11 11 11 COMPLEMENTARITY 0 12 12 ITERATIONS 10 13 13 PRESOLVE_TIME 0.00 14 14 SOLUTION_TIME 0.02
Looks like the beginning of the string does not follow the rules of the rest of the string.
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 25. Read more here about why you should contribute and what is in it for you!
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.