|
楼主

楼主 |
发表于 2010-10-28 14:13:19
|
只看该作者
跟crackman读SAS程序(83)--如何在数据集中的特定位置插入列
From crackman's blog on Baidu
<p>比如数据集A(里面有100个字段),数据集B(里面有20个字段)<br>
<br>
根据数据集A中的ID匹配数据集B中的ADDRESS,产生新的数据集C<br>
<br>
要求数据集C有A的所有内容,和B的ADDRESS,但是B的ADRRESS必须放在A中取出的ID和ID_TYPE中间<br>
<br>
<font face="NSimsun">proc sql noprint;<br>
select upcase(name) into :var_list separated by ' '<br>
from dictionary.columns<br>
where libname='WORK' and memname='A';<br>
quit;<br>
/*第一个:<strong><font style="background-color: #ff0000">利用UPCASE函数</font></strong>消除大小写不一致的情况,让所有的变量都进入宏变量VAR_LIST字符串中*/</font></p>
<p><font face="NSimsun">/*利用DICTIONSARY COLUMNS这个TABLE里面的LIBNAME MENNAME,确定要获取变量名的数据集*/<br>
%let var1=ID;<br>
%let var2=ADDRESS;<br>
%let pos1=%index(&var_list,&var1);/*获得你要插入位置前的变量的位置,INDEX返回一个数字值*/<br>
%let pos2=%eval(&pos1+1+%length(&var2));/*插入一个字符串之后,插入之后,之前预定要插入位置的下一个字符串的起始位置*/<br>
%let new_list=%sysfunc(catx(%str( ),%substr(&var_list,1,%eval(&pos1-1)),&var1,&var2,%substr(&var_list,&pos2)));/*连接形成新的字符串宏变量值*/<br>
<br>
data c;<br>
retain &new_list;<br>
merge a b;<br>
by id;<br>
run;</font><br>
<br>
1 INDEX函数的利用,发现在一个字符串中,某个特定字符或者字符串的位置</p>
<p>2 LENGTH或者一个字符串的长度</p>
<p>3 CATX的连接,注意这里有一个%STR().</p>
<p> </p> <a href="http://hi.baidu.com/crack%5Fman/blog/item/7bc555641a0cf6d08cb10dc8.html">阅读全文</a>
<br/><b>类别:</b><a href="http://hi.baidu.com/crack%5Fman/blog/category/%B8%FAcrackman%B6%C1sas%B3%CC%D0%F2">跟crackman读sas程序</a> <a href="http://hi.baidu.com/crack%5Fman/blog/item/7bc555641a0cf6d08cb10dc8.html#comment">查看评论</a> |
|