我将几个数据快照堆叠在一起,这些快照存在于不同的表中。以下代码遍历大量带日期戳的快照并提取键值对。是否有一种简单的方法可以在此DATA STEP中附加宏变量&InVar.
的值?
一个简单示例可能&channels.
的值为20140106 20140120 20140127
,&nchannels.
的值为3
。
DATA kv_map;
SET
%DO q=1 %TO &nchannels;
%LET InVar=%SCAN(&channels,&q);
%PUT &InVar;
sourcedata.datasnapshot_&InVar.(keep=var_key var_value)
%END;
;
RUN;
输出将是:
kv_map
╔══════════╦═════════╦════════════╗
║ var_key ║ var_map ║ provenace ║
╠══════════╬═════════╬════════════╣
║ aaa ║ 123 ║ 20140106 ║
║ bbb ║ 432 ║ 20140106 ║
║ ccc ║ 313 ║ 20140106 ║
║ fff ║ 654 ║ 20140120 ║
║ ggg ║ 125 ║ 20140120 ║
║ iii ║ 843 ║ 20140120 ║
║ jjj ║ 864 ║ 20140127 ║
╚══════════╩═════════╩════════════╝
(使用http://goo.gl/JIeqZ创建的表)
答案 0 :(得分:1)
对于任何版本,您都可以这样写:
DATA kv_map;
SET
%DO q=1 %TO &nchannels;
%LET InVar=%SCAN(&channels,&q);
%PUT &InVar;
sourcedata.datasnapshot_&InVar.(keep=var_key var_value in=_in_&invar.)
%END;
;
array ins _in_:;
do _i = 1 to dim(ins);
if ins[_i] then provenance=vname(ins[_i]);
end;
RUN;
对于SAS 9.3+,有一种更简单的方法。
DATA kv_map;
SET
%DO q=1 %TO &nchannels;
%LET InVar=%SCAN(&channels,&q);
%PUT &InVar;
sourcedata.datasnapshot_&InVar.(keep=var_key var_value )
%END;
indsname=_provenance
;
provenance=_provenance; *the indsname variable will not be kept, so you need to assign to a different one;
RUN;
现在,我执行此操作会有所不同,以便于阅读。通常,如果您可以将宏内容移动到单独的宏,则可以简化读取代码。
%macro source_data(nchannels=,channels=);
%DO q=1 %TO &nchannels;
%LET InVar=%SCAN(&channels,&q);
%PUT &InVar;
sourcedata.datasnapshot_&InVar.(keep=var_key var_value)
%END;
%mend source_data; *and of course you can add another parameter for libname or datasetname if that might vary also;
data kv_map;
set %source_data(nchannels=3,channels=20140106 20140120 20140127);
run;
宏可以在更早的时候定义(可能会定义其他宏),因此只要您在逻辑上命名它,它就会使您的数据步骤代码更容易阅读。