您告诉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
;
来源
2017-07-16 23:00:35
Tom
您希望SAS为您从第一行数据中读取的6个字符“10/15”生成的日期? – Tom
您的输入文件是固定列还是分隔符?你有没有任何缺失的价值?如果是这样的话,每一个缺失的值(即使是字符变量)标有一段时间?如果每个缺失的值由一个周期表示,那么您可以使用列表模式输入来读取它。 – Tom