并提前感谢您提供的任何帮助,因为我是SAS的新手。
我正在尝试将以下格式的文件读入SAS:
001DATA...
002DATA...
RSSDATA...
001DATA...
002DATA...
RSSDATA...
001DATA...
002DATA...
001DATA...
002DATA...
RSSDATA...
此文件中的每个人都有一个“001”和一个“002”子记录。一些但不是全部具有“RSS”子记录(即,上述示例中的前三行表示来自一个主题的数据)。一个问题是,文件中的每个人都不具有RSS子记录,因此,当我运行下面列出的程序时,那些不会被删除的事件(即,他们的001和002子记录是删除了......上例中的第7行和第8行)。最终结果是我的样本的~1 / 3通过此过程被删除。我正在使用以下代码(为简洁起见,我没有包含所有变量,不,它们都不是全部命名为“变量”:):
INPUT @1 type $CHAR3. @;
RETAIN many variables;
IF type = '001' THEN DO;
INPUT @4 variable $CHAR8.
@12 variable $CHAR1.
;
RETURN;
END;
ELSE IF type = '002' THEN DO;
INPUT @4 variable $CHAR35.
;
RETURN;
END;
ELSE IF type = 'RSS' THEN DO;
INPUT @4 variable $CHAR6.
@10 variable $CHAR1.
;
OUTPUT filename;
END;
RUN;
有没有办法防止这些删除发生?基本上我想要的(在输出文件中)是每行代表一个主题,并包括他们的001,002,如果存在,他们的RSS数据。
再次感谢您提供的任何指导!
答案 0 :(得分:0)
删除没有RSS的记录的原因是因为您在ELSE IF类型中只有一个OUTPUT语句=' RSS'言。
只要您编写显式的OUTPUT语句,SAS就会停止向输出数据集输出任何内容,除非您明确告诉它(使用OUTPUT语句)。
因此,当您读取没有RSS的记录时,它不会被输出,并且读取的值会被下一条记录的值覆盖。
也许避免这个问题的一个简单方法是将你的OUTPUT语句置于最后一个条件之外,然后在程序结束时写下它。
注意:由于您使用的是ELSE IF,我建议删除RETURN语句。
答案 1 :(得分:0)
看起来您应该在下一条记录为001时输出。您需要添加
END=eof
到您的INFILE或SET语句,以使以下代码生效。你的代码并没有真正使用类型变量,但我已经添加了nexttype以防你的完整用例。
INPUT @1 nexttype $CHAR3. @;
RETAIN many variables;
DROP nexttype ;
IF nexttype = '001' THEN DO;
IF _N_ NE 1 THEN OUTPUT filename ; %* do not output before first record fully read in ;
type = '001' ;
INPUT @4 variable $CHAR8.
@12 variable $CHAR1.
;
RETURN;
END:
ELSE IF nexttype = '002' THEN DO;
type = '002' ;
INPUT @4 variable $CHAR35.
;
RETURN;
END;
ELSE IF nexttype = 'RSS' THEN DO;
type = 'RSS' ;
INPUT @4 variable $CHAR6.
@10 variable $CHAR1.
;
END;
IF eof THEN OUTPUT filename ; %* catches last record ;
RUN;
答案 2 :(得分:0)
如果你总是拥有' 001'和' 002'记录然后您的输入可以更简单。首先读取前两个记录,然后从第三个记录中预读类型。然后有条件地读取第三条记录。无需保留,因为您将在数据步骤的同一通道中读取所有记录。如果最后一次观察没有" RSS"你可能会在文件末尾出现问题。记录。您可以使用INFILE语句中的END =选项,以允许您有条件地预读下一个记录的类型。
data want;
infile 'myfile' end=eof;
INPUT @4 variable1 $CHAR8.
@12 variable2 $CHAR1.
/ @4 variable3 $CHAR35.
;
if not eof then input check $3. @@ ;
IF check = 'RSS' THEN
INPUT @4 variable4 $CHAR6.
@10 variable5 $CHAR1.
;
run;