2017-07-16 69 views
0

我试图使用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

您希望SAS为您从第一行数据中读取的6个字符“10/15”生成的日期? – Tom

+0

您的输入文件是固定列还是分隔符?你有没有任何缺失的价值?如果是这样的话,每一个缺失的值(即使是字符变量)标有一段时间?如果每个缺失的值由一个周期表示,那么您可以使用列表模式输入来读取它。 – Tom

回答

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; 
+0

工作原因是您已将DOB的INPUT从格式化更改为列表模式。当SAS在列表模式下阅读时,它会忽略适用信息的宽度,并使用当前正在阅读的单词的宽度。您可以在内联信息前添加冒号修饰符(即使不更改宽度),它将导致SAS以列表模式读取DOB,并忽略信息中指定的宽度。 – Tom

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 
;