我正在尝试使用 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;
什么似乎是问题?
答案 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
;