使用多个条件列表的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中,我如何设置表中没有任何项以不显示错误的条件?希望是有意义的。否则我会发布另一个问题对不起,这对我来说没有意义。不用担心。我想到了明天要尝试的东西,如果不行,我会发布一个新问题。再次感谢