0

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

在基本代码中执行此操作将类似于:

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;

我知道那行不通,但这就是我的想法。

如果有人可以帮助他们弄清楚我该怎么做,我将不胜感激。

谢谢

布莱恩

4

1 回答 1

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;

现在你完成了:) &calllist 包含一个 %split(colname) 调用的列表。如果您可能需要超过 2 个变量(即 > 4000 长度),您可能需要添加一个新参数“长度”;或者,如果您使用的是 9.2 或更高版本,您可以只使用 SUBPAD 而不是 SUBSTR 并为每个外部变量生成所有三个变量。

于 2013-04-09T20:00:20.837 回答