Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个条件列表的SAS宏_Sas - Fatal编程技术网

使用多个条件列表的SAS宏

使用多个条件列表的SAS宏,sas,Sas,我有一个条件表,我想用它来创建我的其他表。现在我想让我的代码遍历我的条件表,同时考虑这两个条件。我的数据如下 Month Date1 Date2 Line Jan2010 01Jan2010 31Jan2010 PL Feb2010 01Feb2010 28Feb2010 CB Feb2010 01Feb2010 28Feb2010 HB Mar2010 01Mar2010 31Mar2010 PL 现行代码 %Macro Split_D

我有一个条件表,我想用它来创建我的其他表。现在我想让我的代码遍历我的条件表,同时考虑这两个条件。我的数据如下

 Month    Date1     Date2     Line  
 Jan2010  01Jan2010 31Jan2010 PL  
 Feb2010  01Feb2010 28Feb2010 CB
 Feb2010  01Feb2010 28Feb2010 HB
 Mar2010  01Mar2010 31Mar2010 PL  
现行代码

  %Macro Split_Data(Month,BeginDate,EndDate,Line);  
  Data Want_&Month._&Line.;  
    Set Have;  
    Where Date > &BeginDate and Date <&EndDate and Line = '&Line.';  
  Quit;
  %Mend;  
  %Split_Data(Jan2010,'01JAN2010'd,'31JAN2010'd,PL);  
  %Split_Data(Jan2010,'01JAN2010'd,'31JAN2010'd,CB);  
%宏分割数据(月、开始日期、结束日期、行);
需要月数据。\行数据。\行数据。;
集有;

Where Date>&BeginDate和Date我认为这些日期可能会使事情复杂化。也就是说,您可以在不带引号的情况下传递SAS日期值,并且宏仍然可以工作。如果您有其他使用该日期的区域,则必须确认其符合您的要求。我通常会使用
data\u null\u
步骤,但我将其保存到此处所需的数据集,以便您可以根据需要查看字符串

data want;
set have;

    str = catt('%split_data(', put(month, yymon7.), ",", date1, ",", date2, ",", line, ");");

call execute(str);
run;

我认为日期可能会使事情复杂化。也就是说,您可以在不带引号的情况下传递SAS日期值,并且宏仍然可以工作。如果您有其他使用该日期的区域,则必须确认其符合您的要求。我通常会使用
data\u null\u
步骤,但我将其保存到此处所需的数据集,以便您可以根据需要查看字符串

data want;
set have;

    str = catt('%split_data(', put(month, yymon7.), ",", date1, ",", date2, ",", line, ");");

call execute(str);
run;

使用元数据生成所需的代码

首先设置一些宏变量(或使用参数生成宏)

然后使用元数据生成一个数据步骤来写入所有输出数据集

filename code temp;
data _null_;
  set &metadata end=eof;
  file code ;
  if _n_=1 then put 'DATA';
  dsname= catx('_',symget('base'),month,line);
  put @2 dsname ;
  if eof then put ';' / @2 "set &inds;" ;
run;

data _null_;
  set &metadata end=eof;
  file code mod;
  dsname= catx('_',symget('base'),month,line);
  put @2 'IF date > "' date1 date9. '"d and date < "' date2 date9. '"d and line=' line :$quote.
         'then output ' dsname ';'
  ;
  if eof then put 'run;' ;
run;
因此,对于您的示例,生成的代码如下所示:

DATA
 WANT_Jan2010_PL
 WANT_Feb2010_CB
 WANT_Feb2010_HB
 WANT_Mar2010_PL
;
 set HAVE;
 IF date > "01JAN2010"d and date < "31JAN2010"d and line="PL" then output WANT_Jan2010_PL ;
 IF date > "01FEB2010"d and date < "28FEB2010"d and line="CB" then output WANT_Feb2010_CB ;
 IF date > "01FEB2010"d and date < "28FEB2010"d and line="HB" then output WANT_Feb2010_HB ;
 IF date > "01MAR2010"d and date < "31MAR2010"d and line="PL" then output WANT_Mar2010_PL ;
run;
数据
想要2010年1月1日吗
想要2010年2月2日吗
想要2010年2月2日吗
想要2010年三月吗
;
集有;
如果日期大于“2010年1月1日”d且日期小于“2010年1月31日”d且line=“PL”,则输出希望\u 2010年1月\u PL;
如果日期大于“2010年2月1日”d且日期小于“2010年2月28日”d且line=“CB”,则输出希望\u 2010年2月2日\u CB;
如果日期大于“2010年2月1日”d且日期小于“2010年2月28日”d且line=“HB”,则输出WANT\u Feb2010\u HB;
如果日期大于“2010年3月1日”d且日期小于“2010年3月31日”d且line=“PL”,则输出WANT\u Mar2010\u PL;
跑

使用元数据生成所需的代码

首先设置一些宏变量(或使用参数生成宏)

然后使用元数据生成一个数据步骤来写入所有输出数据集

filename code temp;
data _null_;
  set &metadata end=eof;
  file code ;
  if _n_=1 then put 'DATA';
  dsname= catx('_',symget('base'),month,line);
  put @2 dsname ;
  if eof then put ';' / @2 "set &inds;" ;
run;

data _null_;
  set &metadata end=eof;
  file code mod;
  dsname= catx('_',symget('base'),month,line);
  put @2 'IF date > "' date1 date9. '"d and date < "' date2 date9. '"d and line=' line :$quote.
         'then output ' dsname ';'
  ;
  if eof then put 'run;' ;
run;
因此,对于您的示例,生成的代码如下所示:

DATA
 WANT_Jan2010_PL
 WANT_Feb2010_CB
 WANT_Feb2010_HB
 WANT_Mar2010_PL
;
 set HAVE;
 IF date > "01JAN2010"d and date < "31JAN2010"d and line="PL" then output WANT_Jan2010_PL ;
 IF date > "01FEB2010"d and date < "28FEB2010"d and line="CB" then output WANT_Feb2010_CB ;
 IF date > "01FEB2010"d and date < "28FEB2010"d and line="HB" then output WANT_Feb2010_HB ;
 IF date > "01MAR2010"d and date < "31MAR2010"d and line="PL" then output WANT_Mar2010_PL ;
run;
数据
想要2010年1月1日吗
想要2010年2月2日吗
想要2010年2月2日吗
想要2010年三月吗
;
集有;
如果日期大于“2010年1月1日”d且日期小于“2010年1月31日”d且line=“PL”,则输出希望\u 2010年1月\u PL;
如果日期大于“2010年2月1日”d且日期小于“2010年2月28日”d且line=“CB”,则输出希望\u 2010年2月2日\u CB;
如果日期大于“2010年2月1日”d且日期小于“2010年2月28日”d且line=“HB”,则输出WANT\u Feb2010\u HB;
如果日期大于“2010年3月1日”d且日期小于“2010年3月31日”d且line=“PL”,则输出WANT\u Mar2010\u PL;
跑


为什么要制作单独的数据集?为什么不合并并使用新行变量?Call Execute允许您从数据集参数调用宏。请看文档中的示例。@Tom我需要这些数据作为我使用的其他软件的输入。@Reeza我已经阅读了我使用的文档,使用一个列表调用execute。但不知道如何将其扩展到多个列表。也要包括BeginDate和EndDate。使用数据步骤生成一个与宏调用完全相同的字符串,我使用CATT将字符串连接在一起。基本上,您也可以将它们连接在一起。另外,使用单引号使宏不会尝试执行。为什么要创建单独的数据集?为什么不合并并使用新行变量?Call Execute允许您从数据集参数调用宏。请看文档中的示例。@Tom我需要这些数据作为我使用的其他软件的输入。@Reeza我已经阅读了我使用的文档,使用一个列表调用execute。但不知道如何将其扩展到多个列表。也要包括BeginDate和EndDate。使用数据步骤生成一个与宏调用完全相同的字符串,我使用CATT将字符串连接在一起。基本上,您也可以将它们连接在一起。另外,请使用单引号,这样宏就不会试图执行。谢谢。我们一定会记住这段代码。在你们的帮助下,我学到了很多。我们一定会记住这段代码。在你们的帮助下,我学到了很多东西,我使用了这些代码。我的实际宏实际上是几个数据步骤。在fro示例数据步骤2…10中,我如何设置表中没有任何项以不显示错误的条件?希望是有意义的。否则我会发布另一个问题对不起,这对我来说没有意义。不用担心。我想到了明天要尝试的东西,如果不行,我会发布一个新问题。谢谢你使用了这段代码。我的实际宏实际上是几个数据步骤。在fro示例数据步骤2…10中,我如何设置表中没有任何项以不显示错误的条件?希望是有意义的。否则我会发布另一个问题对不起,这对我来说没有意义。不用担心。我想到了明天要尝试的东西,如果不行,我会发布一个新问题。再次感谢