Sas 输入日期时出错

Sas 输入日期时出错,sas,Sas,我正在尝试使用数据线输入日期,但它不起作用: data demographic; input Subj @5 DOB mmddyy6. @16 Gender $ Name $; format dob ddmmyy10.; datalines; 001 10/15/1960 M Friedman 002 08/01/1955 M Stern 003 12/25/1988 F McGoldrick 005 05/28/1949 F Chien ; run; 问题似乎出在哪里?

我正在尝试使用
数据线输入日期
,但它不起作用:

 data demographic;
 input Subj  @5 DOB mmddyy6. @16 Gender $ Name $;
 format dob ddmmyy10.;
 datalines;
 001 10/15/1960 M Friedman
 002 08/01/1955 M Stern
 003 12/25/1988 F McGoldrick
 005 05/28/1949 F Chien
 ;
 run;

问题似乎出在哪里?

当您在输入语句中包含格式时,它正好需要该格式/长度。在本例中,您错误地指定了日期信息。这是一个10个字符的变量,您尝试只使用6个字符。如果您创建INFORMAT语句并从输入语句中删除规范,它将正常工作

 data demographic;
 informat subj $3. dob mmddyy10. gender $1. name $16.;
 input Subj   DOB  Gender  Name ;
 format dob ddmmyy10.;
 datalines;
 001 10/15/1960 M Friedman
 002 08/01/1955 M Stern
 003 12/25/1988 F McGoldrick
 005 05/28/1949 F Chien
 ;
 run;

您告诉SAS从第5列开始读取DOB,并且只读取6个字符。但是,DOB的数据值包括斜杠和年份的世纪数字,因此它们最多需要10个字符

如果您的输入流是固定格式的,那么您可以将informat上的宽度更改为10,而不是6。因此,如果您的数据字段位置是固定的,那么您的输入语句可能如下所示。(就我个人而言,我喜欢使用YMD设置日期格式,以避免与美国(MDY)和欧盟(DMY)的人一起工作时产生混淆。)

现在,如果输入数据不在固定的列位置(任何缺少的值都由
表示),则可以使用列表模式输入读取数据。在输入语句的任何信息之前使用
修饰符,以确保您使用的是列表模式而不是格式化模式。当SAS在列表模式下读取变量值时,它将忽略适用信息上的宽度,并使用正在读取的当前字的长度。如果希望利用INPUT语句作为变量出现的第一个位置来定义变量的类型和长度,那么可以使用$xx。输入语句的信息,只需确保包含
修饰符。SAS在读取数据时将忽略宽度,但由于它是您引用变量的第一个位置,SAS将使用信息的宽度来帮助您猜测您希望如何定义变量

data demographic;
  input Subj DOB :MMDDYY. Gender :$1. Name :$10.;
  format dob YYMMDD10.;
datalines;
001 10/15/1960 M Friedman
002 8/1/1955 M Stern
003 . F McGoldrick
005 5/28/1949 F Chien
;
或者,您可以在输入语句中使用LENGTH或ATTRIB语句之前显式定义变量。在这种情况下,您可能只需要使用INFORMAT语句来告诉SAS如何读取DOB,而不是将INFORMAT包含在INPUT语句中。这可以使输入语句更容易编写,因为您可以使用变量列表

data demographic;
  length Subj 8 DOB 8 Gender $1 Name $10 ;
  informat dob mmddyy.;
  format dob YYMMDD10.;
  input subj -- name ;
datalines;
001 10/15/1960 M Friedman
002 8/1/1955 M Stern
003 . F McGoldrick
005 5/28/1949 F Chien
;

您希望SAS为从第一行数据读取的6个字符“10/15/”生成什么日期?输入文件是固定列还是分隔列?您是否有任何缺少的值?如果是这样的话,每个缺失的值(甚至是字符变量)是否都用句点标记?如果每个缺少的值都由一个句点表示,那么您可以使用列表模式输入读取它。工作的原因是您已将DOB的输入从格式化更改为列表模式。当SAS以列表模式读取时,它会忽略适用信息的宽度,而只使用它正在读取的当前单词的宽度。您只需在行内信息前面添加冒号修饰符(即使不更改宽度),它将导致SAS以列表模式读取DOB并忽略信息上指定的宽度。
data demographic;
  length Subj 8 DOB 8 Gender $1 Name $10 ;
  informat dob mmddyy.;
  format dob YYMMDD10.;
  input subj -- name ;
datalines;
001 10/15/1960 M Friedman
002 8/1/1955 M Stern
003 . F McGoldrick
005 5/28/1949 F Chien
;