2013-04-09 625 views
0

我有一组数据集,其中某些变量已被定义为长度> 2000个字符。我想要做的是创建一个标识这些变量的宏,然后创建一组新的变量来保存这些值。SAS从宏变量创建和填充数据集变量

基代码这样做会是这样的:

data new_dset; 
set old_dset: 
length colnam1 colnam2 colnam3 2000.; 
colnam1 = substr(long_column,1,2000); 
colnam2 = substr(long_column,2001,2000); 
run; 

我可以建立变量名和长度为一组宏观变量的名单,但我不知道如何创建新的来自宏变量的变量。

我想它看起来像为:

%macro split; 

data new_dset; 
set old_dset; 
%do i = 1%to &num_cols; 

    if &&collen&i > 2000 then do; 

     &&colnam&i 1 = substr(&&colnam&i,1,2000); 
    end; 
%en; 
run; 
%mend; 

我知道这是不行的,但是这是我的想法有。

如果任何人都可以帮助他解决问题,我将会非常感激。

感谢

布莱恩

回答

1

您的宏并不需要是整个数据的一步。在这种情况下,准确地查看您正在复制的内容并根据其编写宏是很有帮助的。

所以,你的代码是:

data new_dset; 
set old_dset: 
length colnam1 colnam2 colnam3 2000.; 
colnam1 = substr(long_column,1,2000); 
colnam2 = substr(long_column,2001,2000); 
run; 

您的宏然后真正需要的是:

length colnam1 colnam2 colnam3 2000.; 
colnam1 = substr(long_column,1,2000); 
colnam2 = substr(long_column,2001,2000); 

所以你可以做的是把在一个宏:

%macro split(colname=); 
length &colname._1 &colname._2 $2000; 
&colname._1 = substr(&colname.,1,2000); 
&colname._2 = substr(&colname.,2001,4000); 
%mend; 

然后你生成一个电话列表:

proc sql; 
select cats('%split(colname=',name,')') into :calllist separated by ' ' 
    from dictionary.columns 
    where libname = 'WORK' and memname='MYDATASET' 
    and length > 2000; 
quit; 

然后你运行它们:

data new_dset; 
set old_dset; 
&calllist; 
run; 

现在大功告成:) &呼叫清单包含%分割的列表(colname的)调用。如果您可能需要超过2个变量(即> 4000长度),则可能需要添加一个新参数'length';或者如果你在9.2或更新版本中,你可以使用SUBPAD而不是SUBSTR,并为每个外部变量生成全部三个变量。