【问题标题】:resolve macro variables for saving/naming a dataset in SAS解析用于在 SAS 中保存/命名数据集的宏变量
【发布时间】:2015-05-06 13:26:44
【问题描述】:

我在将使用宏变量的数据集保存到所需目录时遇到问题。

基本上,我想根据 &var 和 &age 的值将数据集“_est”保存到库“sret”。我写了以下代码:

%let var=k;
%let age=2;
...
...
data sret.est_&var&age._b3; 
  set _est;
run;

我想要的是“sret”中名为“est_k2_b3.sas7bdat”的数据集。但是代码给我的是保存在我想要的文件夹中的数据集“est_k2.sas7bdat”和工作库中的另一个数据集“_b3”。两个数据集是相同的。我很困惑如何解决这个问题。

【问题讨论】:

  • 这段代码看起来不错。你确定这个数据声明正是你使用的吗?你用的是什么操作系统?
  • 你得到的行为表明在 &age 末尾有一个空格。你是在别处换吗?试试%put "&age";,看看日志看看有没有空格。
  • @itzy 我使用的是 Windows 7 和 SAS9.3。
  • 其实我之前已经成功解决过一次。但是现在拿不到了。我不知道这是否与我正在使用的宏有关。我有一个主宏,它调用其他 .sas 文件作为子例程,代码在子例程中。
  • 之前我想在宏中直接包含这样的代码时也遇到过类似的问题。

标签: macros sas naming resolve


【解决方案1】:

正如 itzy 指出的,您在“2”之后有一个空格,将您的数据集名称一分为二。

我可以复制这个问题,只用调用符号定义宏变量age

data _null_;
    age='2 ';
    call symput('age',age);
run;

如果是这种情况,您可以通过使用 strip() 删除数据步骤中的空格、使用 call symputx()(与数字一起使用)或在数据步骤后使用%let,自动删除空格:

%let age= &age.;

【讨论】:

  • 感谢您的建议。我没有从数据集中获得 &age 的值。我只是手动设置它的值。顺便说一句,如何使用call symputx()
  • 在数据步骤中使用它而不是 call symput()。如果您手动或在数据步骤之外定义 age 变量,请在使用 %let age= &age.; 语句构造数据集名称之前删除空格(如您的示例中所示)。
【解决方案2】:

有一个非常相似的问题。在您使用 strip() 之前,会以某种方式添加一个空格。这是下面的示例。

data test;
    input numdays;
    datalines;
    31
;

%macro monthly(months);

%let count=%sysfunc(countw(&months.));
%do i=1 %to &count.;
    %let value=%qscan(&months.,&i,%str(,));
    %let month=%sysfunc(strip(&value.));
    %put &value.;
    %put &month.;

data value_&value.;
    set test;
run;

data month_&month.;
    set test;
run;

%end;
%mend;
%monthly(%str(oct,jan));

【讨论】:

  • 如果你不使用%QSCAN()而不是%SCAN()来引用空格,那么以后就不需要删除它们。
  • 你为什么首先使用逗号作为分隔符?为什么不使用空间?或者至少是逗号以外的其他字符。这将使宏调用更加容易。
猜你喜欢
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多