【问题标题】:SAS Error trying to loop through multiple datasetsSAS 错误尝试遍历多个数据集
【发布时间】:2017-01-04 15:17:57
【问题描述】:

我正在尝试运行一些代码,这些代码有望连接数月或数年的数据。我试图弄清楚一个字段何时填充了一个值。 IE。我的数据集中有 XYZ 字段,它在 2016 年 11 月填充了值 A。如果我从 1 月到 12 月运行我的代码,我想要一个新字段,其中填充 SAS 在该字段中遇到非空白值的日期。

这是我的代码:

    options mprint symbolgen source mlogic merror syntaxcheck ;

%macro append_monthly(iStart_date=, iEnd_date=);

  %local tmp_date i;
  %let tmp_date = %sysfunc(intnx(month,&iStart_date,0,beginning)) ;

  %do %while (&tmp_date le &iEnd_date);

    %let i = %sysfunc(sum(&tmp_date),yymmn4.);
    %put &i.;

    %let tmp_date = %sysfunc(intnx(month,&tmp_date,1,beginning)) ;

    libname note "my.qualifiers.fords.note&i." disp=shr;

data new ;
set note.file ;

%if ln_note_crbur_date_delinq ne '' %then spc_cmt_date = &i.;

run;

  %end;


%mend;
%append_monthly(iStart_date=%sysfunc(mdy(5,1,2016)),  iEnd_date=%sysfunc(mdy(10,1,2016)) );

LIBNAME _ALL_ CLEAR;

这是来自错误日志的示例:

SYMBOLGEN:  Macro variable TMP_DATE resolves to 20606
SYMBOLGEN:  Macro variable IEND_DATE resolves to 20728
MLOGIC(APPEND_MONTHLY):  %DO %WHILE(&tmp_date le &iEnd_date) condition is TRUE; loop will iterate again.
MLOGIC(APPEND_MONTHLY):  %LET (variable name is I)
SYMBOLGEN:  Macro variable TMP_DATE resolves to 20606
MLOGIC(APPEND_MONTHLY):  %PUT &i.
SYMBOLGEN:  Macro variable I resolves to 1606
1606
MLOGIC(APPEND_MONTHLY):  %LET (variable name is TMP_DATE)
SYMBOLGEN:  Macro variable TMP_DATE resolves to 20606
MPRINT(APPEND_MONTHLY):   spc_cmt_date = 1605 run;
SYMBOLGEN:  Macro variable I resolves to 1606
MPRINT(APPEND_MONTHLY):   libname note "my.qualifiers.fords.note1606" disp=shr;
ERROR: Unable to clear or re-assign the library NOTE because it is still in use.
ERROR: Error in the LIBNAME statement.
NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.NEW may be incomplete.  When this step was stopped there were 0 observations and 622 variables.
WARNING: Data set WORK.NEW was not replaced because this step was stopped.
NOTE: The DATA statement used 0.01 CPU seconds and 49483K.

NOTE: The address space has used a maximum of 4292K below the line and 240388K above the line.

我不明白为什么这不起作用。也许这可以使用 Proc append 来工作。

基本上,我只希望我的输出带有一个字段,当字段 ln_note_crbur_date_delinq 为非空白时,该字段以 YYMM 的形式返回日期。

任何帮助将不胜感激

【问题讨论】:

    标签: date sas syntax-error


    【解决方案1】:

    我猜你的错误的原因是在下一个 libname 语句尝试重新分配之前没有清除源文件上的句柄。

    一个简单的解决方法是每次使用不同的别名 (libref),如下所示:

    libname note&i "my.qualifiers.fords.note&i." disp=shr;
    

    然后像这样调整您的数据步骤:

    data new ;
      set note&i..file ;
    

    下一部分似乎是宏逻辑和数据步骤之间的混淆。只需删除% 符号,如下所示:

    if ln_note_crbur_date_delinq ne '' then spc_cmt_date = &i.;
    

    最后,在%end前添加proc append,如下:

    proc append base=work.final data=new; run;
    

    如果work.final不存在,则会以与new相同的格式创建。

    编辑:

    在 cmets 讨论之后,这里是一个修改后的方法:

    %macro append_monthly(iStart_date=, iEnd_date=);
      %local tmp_date i set_statement;
      %let tmp_date = %sysfunc(intnx(month,&iStart_date,0,beginning)) ;
      %do %while (&tmp_date le &iEnd_date);
        %let i = %sysfunc(sum(&tmp_date),yymmn4.);
        %let tmp_date = %sysfunc(intnx(month,&tmp_date,1,beginning)) ;
        %let set_statement=&set_statement &i..file;
        libname note&i "my.qualifiers.fords.note&i." disp=shr;
      %end;
      data new ;
        set &set_statement;
        if ln_note_crbur_date_delinq ne '' then spc_cmt_date = &i.;
      run;
    %mend;
    %append_monthly(iStart_date=%sysfunc(mdy(5,1,2016)),  iEnd_date=%sysfunc(mdy(10,1,2016)) );
    
    LIBNAME _ALL_ CLEAR; 
    

    【讨论】:

    • 我是宏的新手。我一直假设您在宏内部使用宏函数,即使它是一个数据步。所以在前面添加 % 符号。谢谢你的澄清:)
    • 问题:set 语句不会将新的 note.file 连接到 work.new 吗?我认为 set 语句中有不同的数据集完成了这消除了对 proc append 的需要?也许它正在覆盖它。我只是好奇它是如何工作的
    • Nope.. 宏语言是一个文本生成器,你用它来编写(非宏)SAS 代码。因此,宏语句总是在底层数据步骤等之前运行。
    • 是的,你可以——这实际上是一种更好(更有效)的方法。为此,您需要在运行数据步骤之前定义所有 libname 语句。 set 语句允许您“设置”多个输入数据集,但是 - 使用当前语法 - 每次运行该步骤时,您都在重建输出数据集 (new)。
    • 我已经继续更新答案以合并上述内容。
    猜你喜欢
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2010-12-02
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多