输入日期时出错

时间:2017-07-16 17:06:45

标签: sas

我正在尝试使用 datalines 输入日期,但它无效:

 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;

什么似乎是问题?

2 个答案:

答案 0 :(得分:0)

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

 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;

答案 1 :(得分:0)

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

如果您的输入流是固定格式,那么您只需将信息的宽度更改为10而不是6.因此,如果您的数据字段位置已修复,则输入语句可能如下所示。 (就我个人而言,我喜欢使用YMD命令格式化日期,以避免在与美国(MDY)和欧盟(DMY)的人合作时产生混淆。)

data demographic;
  input Subj 1-3 @5 DOB MMDDYY10. Gender $16 Name $18-27;
  format dob YYMMDD10.;
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
;

现在,如果您的输入数据不在固定列位置(并且任何缺失值由.表示),那么您可以使用列表模式输入来读取数据。在输入语句的任何信息之前使用:修饰符以确保您使用列表模式而不是格式化模式。当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
;

或者你可以在INPUT语句中使用它们之前使用LENGTH或ATTRIB语句显式定义变量。在这种情况下,您可能只想使用INFORMAT语句告诉SAS如何读取DOB而不是在INPUT语句中包含信息。这可以使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
;