首页 > 解决方案 > SAS INPUT 语句中信息前面的冒号

问题描述

我想知道为什么,如果 SAS 通过数据步骤中的 INPUT 语句仅读取日期变量,似乎有必要在每个信息名称之前写一个冒号,而如果变量列表以另一种类型开头变量(例如字符变量),信息前面不需要冒号。为了说明我的问题,两个小程序(见下文)。第一个为日期生成无效数据(只要我在 mmddyy10. 之前不写冒号,以获取 INPUT date :mmddyy10.;),而第二个没有。奇怪,不是吗?对此可能有一些解释,但尽管搜索了 SAS 支持文档和论坛,但我无法发现它可能是什么。欢迎任何帮助!无论如何,如果我能早点明白什么是利害攸关的,我就可以节省几个小时来尝试解决这个问题。

* program #1;
DATA _NULL_;
    INPUT date mmddyy10.;
    DATALINES;
    09/14/2012
    09/15/2012 
    ;
  RUN;
  PROC PRINT; RUN;

* program #2;
  DATA _NULL_;
     INPUT id $ date mmddyy10.;
   DATALINES;
    A 09/14/2012
    B 09/15/2012 
   ;
  RUN;

标签: dateinputsas

解决方案


在您的第一个程序中,您告诉 SAS 读取前 10 个字符作为日期。但是前 4 个字符都是空格。因此,您要求它尝试转换' 09/14/'为日期。我建议始终从第一列开始键入 DATALINES(又名 CARDS)语句,以防止编辑器的自动缩进功能导致数据行也被缩进。

:内联格式规范前面的冒号 ( ) 告诉 SAS 使用列表模式输入而不是格式化输入。使用格式化输入 SAS 读取格式指定的字符数。在列表模式下,SAS 根据当前分隔符和 dsd 设置读取行中的下一个字段。调整用于信息的宽度以匹配行中下一个字段的实际宽度。

例子:

data test;
  length name1-name3 $30 ;
  input @1 name1
        @1 name2 $5.
        @1 name3 :$5. 
  ;
cards;
Elizabeth
;

结果:

Obs      name1      name2      name3

 1     Elizabeth    Eliza    Elizabeth

推荐阅读