将分层(ish)数据读入SAS

时间:2015-12-30 17:12:10

标签: sas

并提前感谢您提供的任何帮助,因为我是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数据。

再次感谢您提供的任何指导!

3 个答案:

答案 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;