我有以下我创建的宏和数据集
%censusdata (districtname=,districtnum=);
data districtcodes;
input distnumber distname$;
cards;
1 Kaap/Cape
2 Simonstad
3 Bellville
4 Goodwood
5 Kuilsrivier
6 Wynberg
run;
基本上我想创建一个do循环,它从distname
数据集中获取districtcodes
并将其输入distrctname
宏中的%censusdata
,{{1}并将其输入宏中的distnumber
字段。
我应该怎么做?
答案 0 :(得分:3)
假设您已经开发了一个宏,可以使用CALL EXECUTE和数据集中的参数值来调用它。
”end-1c”
答案 1 :(得分:1)
如您所见,DATA步骤datalines
(又名cards
)与宏系统不兼容。
您可能想重新考虑数据必须在宏内的原因。有一些用例,但最初看起来比较少。
无论推理如何,都有两种方式(还有更多)
这是一个使用DATA步骤字符串解析
%macro censusdata (districtname=,districtnum=);
data districtcodes (keep=dist:);
*input distnumber distname$;
*cards;
data = "
1 Kaap/Cape
2 Simonstad
3 Bellville
4 Goodwood
5 Kuilsrivier
6 Wynberg
";
put data=;
put data= $HEX60.;
do _n_ = 1 by 1 while (length(scan(data,_n_,' ')));
distnumber = input ( scan (data, _n_, ' '), best8. );
_n_ + 1;
districtname = scan (data, _n_, ' ');
output;
if _n_ > 10 then stop;
end;
stop;
run;
%mend;
%censusdata();
你展示的宏示例似乎有点奇怪,因为你传递参数,表面上是为了帮助操作一些数据,这是一个关于宏的静态实体。
更合理的方法可能是
只有在满足操作模型的各种数据集上执行相同类型的处理时,这样的宏才有意义(即数据集至少有两列,一列用于代码,第二列用于某些相关文字)。
正如您所看到的,使用高度特定的名称和参数(例如censusdata
,districtname
,districtcode
)对宏进行编码可能是一个几乎没有重用价值的包装器。
data districtcodes;
input distnumber distname$;
cards;
1 Kaap/Cape
2 Simonstad
3 Bellville
4 Goodwood
5 Kuilsrivier
6 Wynberg
run;
示例调用
%censusdata (data=districtcodes, codevar=distnumber, namevar=distname);
%mend;