sas macro datalines sas

时间:2018-03-23 20:09:25

标签: macros sas sas-macro

data macpro.bimodels_type;
infile datalines ;
input Model & $ model_class$ model_price model_frame$ DOpurchase;
*length Model$20. model_class$25. model_price4. ;
datalines;
Black Bora    Track        796   Aluminum  01Aug2009 
Delta Breeze  Road        400   CroMoly     23Aug2010 
Jet Stream      Track       1160  CroMoly    01Aug2009 
Mistral            Road        1995 Carbon Comp 01Jul2010 
Nor'easter      Mountain  900 Aluminum        05Jul2010 
Santa Ana      Mountain  459 Aluminum        20Jul2010 
Scirocco         Mountain  2300 Titanium        08Sep2011 
Trade Wind    Road          759 Aluminum       08Sep2011 

Model变量i中我试图修复空白,我使用&语法如input Model & $等等......但我无法在单列中修复Black Bora。我怎么能解决这个问题。

2 个答案:

答案 0 :(得分:1)

在SAS已经确定它将会是什么之后,您无法更改字符变量的长度。如果我在其他语句中使用它们之前明确定义变量,我发现更容易做到正确。

data bimodels_type;
   infile datalines truncover ;
   length Model $20 model_class $25 model_price 8 model_frame $20 DOpurchase 8 ;
   format DOpurchase date9. ;
   input Model & model_class model_price model_frame & DOpurchase :date.;
datalines;
Black Bora    Track        796   Aluminum  01Aug2009 
Delta Breeze  Road        400   CroMoly     23Aug2010 
Jet Stream      Track       1160  CroMoly    01Aug2009 
Mistral            Road        1995 Carbon Comp 01Jul2010 
Nor'easter      Mountain  900 Aluminum        05Jul2010 
Santa Ana      Mountain  459 Aluminum        20Jul2010 
Scirocco         Mountain  2300 Titanium        08Sep2011 
Trade Wind    Road          759 Aluminum       08Sep2011 
;

要使&修饰符起作用,您需要在值之后和下一个值之前至少有两个空格(实际上是分隔符)。因此,在您的数据中,第四行会出现问题,因为在日期之前没有两个空格。

您可以修复输入数据。

Mistral            Road        1995 Carbon Comp  01Jul2010 

或者,如果您知道每条记录都有一个日期,您可以将其作为前一个字符变量的一部分读取,然后将其取出。

data bimodels_type;
   infile datalines truncover ;
   length Model $20 model_class $25 model_price 8 model_frame $50 DOpurchase 8 ;
   format DOpurchase date9. ;
   input Model & model_class model_price model_frame $50.;
   DOpurchase=input(scan(model_frame,-1,' '),date11.);
   model_frame = substr(model_frame,1,length(model_frame)-9);
datalines;
Black Bora    Track        796   Aluminum  01Aug2009
Delta Breeze  Road        400   CroMoly     23Aug2010
Jet Stream      Track       1160  CroMoly    01Aug2009
Mistral            Road        1995 Carbon Comp 01Jul2010
Nor'easter      Mountain  900 Aluminum        05Jul2010
Santa Ana      Mountain  459 Aluminum        20Jul2010
Scirocco         Mountain  2300 Titanium        08Sep2011
Trade Wind    Road          759 Aluminum       08Sep2011
;

答案 1 :(得分:1)

如果您确实试图将包含数据的代码包装在宏中(如标题所示),那么这不会起作用。数据/卡是无法在宏中执行的语句。作为替代方案,您可以将数据保存在文本文件中并读入该文件,该文件在宏代码中有效。