有没有办法根据if条件将宏变量分配给SAS数据集的输出?
Is there a way to assign macro variable to output of SAS data set based on if condition?
我想知道是否有一种方法可以根据 if 语句从 SAS table 中提取输出,然后将该输出分配给宏变量?
我已经尝试过下面的代码,但它不起作用
/*Working*/
libname param '<directory>'; /*contain parameter table*/
data _null_;
set PARAM.RPTAUTO_PARAMETERTBL_MP;
call symput('task_id', task_id);
call symput('functionality', functionality);
call symput('parameter', parameter);
call symput('value', value);
put task_id= functionality= parameter= value= ;
run;
/*Not Working*/
data _null_;
set PARAM.RPTAUTO_PARAMETERTBL (where=(TASK_ID='&task_id.' and FUNCTIONALITY='&functionality.' ));
if parameter='mnthly' then call symput('mnthly',mnthly);
else if parameter='emailsubject' then call symput('emailsubject',emailsubject);
else if parameter='emailrecipient' then call symput('emailrecipient',emailrecipient);
else if parameter='emailcc' then call symput('emailcc',emailcc);
else if parameter='content_type' then call symput('contenttype',contenttype);
else if parameter='attach' then call symput('attach',attach);
else if parameter='finyrs' then call symput('finyrs',finyrs);
else if parameter='ext_dt' then call symput('ext_dt',ext_dt);
title="TASK1045V2 Benefit Type summary for last &finyrs years. NOTE: YEAR extends from "||
substr(put(&ext_dt+1),3,3)||' to '||substr(put(&ext_dt),3,3);
call symput('title',trim(title)) ;
/*view results in Log file. It shouldn't be blank*/
put mnthly= emailsubject= emailrecipient= emailcc= content_type= attach= finyrs= ext_dt= title= ;
run;
我的 SAS table RPTAUTO_PARAMETERTBL_MP 在照片中。
RPTAUTO_PARAMETERTBL_MP
我基本上想在参数 = 'mthly' 时为宏变量 'mthly' 分配 'parameter' 列的值;当参数 = 'emailsubject' 等
时,宏变量 'emailsubject' 的值为 'parameter' 列
您的意思是将 "VALUE" 列中的值作为宏名称分配给 "PARAMETER" 中的值吗?
如果是这样,这应该可以满足您的需求
data _null_;
set PARAM.RPTAUTO_PARAMETERTBL_MP;
call symput(parameter, value);
run;
问题在于引用宏变量。如果你想比较字符变量的值和宏参数,你应该使用"¯o_var"
,而不是'¯o_var'
。
因此,修复数据步骤中的 where
语句:
set PARAM.RPTAUTO_PARAMETERTBL (where=(TASK_ID="&task_id." and FUNCTIONALITY="&functionality." ));
显示的代码似乎不稳定。 set
语句
set PARAM.RPTAUTO_PARAMETERTBL (where=(TASK_ID='&task_id.' and …
return 是一行还是几行(每个参数一个)?
如果是多个,我希望结构和内容是
task_id functionality parameter parameter_value
------- ------------- --------- ---------------
row 1 ttttt fffff mnthly xxxx
row 2 ttttt fffff emailsubject yyyy
… …
ttttt fffff ext_dt zzzz
而不是(如代码所示)
task_id functionality parameter mnthly emailsubject … ext_dt
------- ------------- --------- ------ ------------ … ------
row 1 ttttt fffff mnthly xxxx
row 2 ttttt fffff emailsubject yyyy
… …
ttttt fffff ext_dt zzzz
无论如何,
SYMGET
用于在数据步长为运行时获取宏变量的当前值。无法使用 &
解析检索到的值以影响 运行 步骤的源代码。
因此,&
代码如下:
…
else if parameter='finyrs' then call symput('finyrs',finyrs);
else if parameter='ext_dt' then call symput('ext_dt',ext_dt);
title="TASK1045V2 Benefit Type summary for last &finyrs years. NOTE: YEAR extends from "||
substr(put(&ext_dt+1),3,3)||…
将重述为
…
else if parameter='finyrs' then call symput('finyrs',finyrs);
else if parameter='ext_dt' then call symput('ext_dt',ext_dt);
title="TASK1045V2 Benefit Type summary for last "
|| symget('finyrs') || years. NOTE: YEAR extends from "
|| substr(put( symget('ext_dt') +1),3,3) || …
但是,您可能需要重新考虑该策略。
运行 步骤部分首先使用 SYMPUT
s,以填充宏变量,然后在第二步中使用
data _null_;
… symputs …
run;
* populated macro variables can be resolved with & in title assignment source code;
data _null_;
title="TASK1045V2 Benefit Type summary for last &finyrs years. NOTE: YEAR extends from "||
substr(put(&ext_dt+1),3,3)||' to '||substr(put(&ext_dt),3,3);
call symput('title',trim(title)) ;
/*view results in Log file. It shouldn't be blank*/
put mnthly= emailsubject= emailrecipient= emailcc= content_type= attach= finyrs= ext_dt= title= ;
run;
另一种选择是 retain
数据步 PDV 中的参数变量值,而不是将它们存储在宏符号 table 中。使用的方法取决于实际的参数table数据结构
如果实际结构是一行如
task_id functionality parameter mnthly emailsubject … ext_dt
------- ------------- --------- ------ ------------ … ------
row 1 ttttt fffff mnthly xxxx yyyy … zzzz
那么你写的多个ifs就不需要了,也不需要宏变量的symput,赋值的时候直接使用PDV中已有的数据集变量即可。
我想知道是否有一种方法可以根据 if 语句从 SAS table 中提取输出,然后将该输出分配给宏变量?
我已经尝试过下面的代码,但它不起作用
/*Working*/
libname param '<directory>'; /*contain parameter table*/
data _null_;
set PARAM.RPTAUTO_PARAMETERTBL_MP;
call symput('task_id', task_id);
call symput('functionality', functionality);
call symput('parameter', parameter);
call symput('value', value);
put task_id= functionality= parameter= value= ;
run;
/*Not Working*/
data _null_;
set PARAM.RPTAUTO_PARAMETERTBL (where=(TASK_ID='&task_id.' and FUNCTIONALITY='&functionality.' ));
if parameter='mnthly' then call symput('mnthly',mnthly);
else if parameter='emailsubject' then call symput('emailsubject',emailsubject);
else if parameter='emailrecipient' then call symput('emailrecipient',emailrecipient);
else if parameter='emailcc' then call symput('emailcc',emailcc);
else if parameter='content_type' then call symput('contenttype',contenttype);
else if parameter='attach' then call symput('attach',attach);
else if parameter='finyrs' then call symput('finyrs',finyrs);
else if parameter='ext_dt' then call symput('ext_dt',ext_dt);
title="TASK1045V2 Benefit Type summary for last &finyrs years. NOTE: YEAR extends from "||
substr(put(&ext_dt+1),3,3)||' to '||substr(put(&ext_dt),3,3);
call symput('title',trim(title)) ;
/*view results in Log file. It shouldn't be blank*/
put mnthly= emailsubject= emailrecipient= emailcc= content_type= attach= finyrs= ext_dt= title= ;
run;
我的 SAS table RPTAUTO_PARAMETERTBL_MP 在照片中。
RPTAUTO_PARAMETERTBL_MP
我基本上想在参数 = 'mthly' 时为宏变量 'mthly' 分配 'parameter' 列的值;当参数 = 'emailsubject' 等
时,宏变量 'emailsubject' 的值为 'parameter' 列您的意思是将 "VALUE" 列中的值作为宏名称分配给 "PARAMETER" 中的值吗?
如果是这样,这应该可以满足您的需求
data _null_;
set PARAM.RPTAUTO_PARAMETERTBL_MP;
call symput(parameter, value);
run;
问题在于引用宏变量。如果你想比较字符变量的值和宏参数,你应该使用"¯o_var"
,而不是'¯o_var'
。
因此,修复数据步骤中的 where
语句:
set PARAM.RPTAUTO_PARAMETERTBL (where=(TASK_ID="&task_id." and FUNCTIONALITY="&functionality." ));
显示的代码似乎不稳定。 set
语句
set PARAM.RPTAUTO_PARAMETERTBL (where=(TASK_ID='&task_id.' and …
return 是一行还是几行(每个参数一个)?
如果是多个,我希望结构和内容是
task_id functionality parameter parameter_value
------- ------------- --------- ---------------
row 1 ttttt fffff mnthly xxxx
row 2 ttttt fffff emailsubject yyyy
… …
ttttt fffff ext_dt zzzz
而不是(如代码所示)
task_id functionality parameter mnthly emailsubject … ext_dt
------- ------------- --------- ------ ------------ … ------
row 1 ttttt fffff mnthly xxxx
row 2 ttttt fffff emailsubject yyyy
… …
ttttt fffff ext_dt zzzz
无论如何,
SYMGET
用于在数据步长为运行时获取宏变量的当前值。无法使用 &
解析检索到的值以影响 运行 步骤的源代码。
因此,&
代码如下:
…
else if parameter='finyrs' then call symput('finyrs',finyrs);
else if parameter='ext_dt' then call symput('ext_dt',ext_dt);
title="TASK1045V2 Benefit Type summary for last &finyrs years. NOTE: YEAR extends from "||
substr(put(&ext_dt+1),3,3)||…
将重述为
…
else if parameter='finyrs' then call symput('finyrs',finyrs);
else if parameter='ext_dt' then call symput('ext_dt',ext_dt);
title="TASK1045V2 Benefit Type summary for last "
|| symget('finyrs') || years. NOTE: YEAR extends from "
|| substr(put( symget('ext_dt') +1),3,3) || …
但是,您可能需要重新考虑该策略。
运行 步骤部分首先使用 SYMPUT
s,以填充宏变量,然后在第二步中使用
data _null_;
… symputs …
run;
* populated macro variables can be resolved with & in title assignment source code;
data _null_;
title="TASK1045V2 Benefit Type summary for last &finyrs years. NOTE: YEAR extends from "||
substr(put(&ext_dt+1),3,3)||' to '||substr(put(&ext_dt),3,3);
call symput('title',trim(title)) ;
/*view results in Log file. It shouldn't be blank*/
put mnthly= emailsubject= emailrecipient= emailcc= content_type= attach= finyrs= ext_dt= title= ;
run;
另一种选择是 retain
数据步 PDV 中的参数变量值,而不是将它们存储在宏符号 table 中。使用的方法取决于实际的参数table数据结构
如果实际结构是一行如
task_id functionality parameter mnthly emailsubject … ext_dt
------- ------------- --------- ------ ------------ … ------
row 1 ttttt fffff mnthly xxxx yyyy … zzzz
那么你写的多个ifs就不需要了,也不需要宏变量的symput,赋值的时候直接使用PDV中已有的数据集变量即可。