INPUT语句中的SAS-@符号



我有以下程序,但不明白INPUT行末尾的@符号的作用:

data colors;
input @1 Var1 $ @8 Var2 $ @;
input @1 Var3 $ @8 Var4 $ @;
datalines;
RED ORANGE YELLOW GREEN
BLUE INDIGO PURPLE VIOLET
CYAN WHOTE FICSIA BLACK
GRAY BROWN PINK MAGENTA
run;
proc print data=colors;
run;

INPUT行末尾不带@的输出与带@的输出不同。

你能澄清一下第2行和第3行INPUT末尾的@是做什么的吗?

input语句末尾的@表示,不要将行指针放在分号之后。@@意味着,也不要在run语句之后推进行指针

通常,输入语句在分号后有一个隐式的将行指针提前一个。因此:

data want;
input a b;
datalines;
1 2 3 4
5 6 7 8
run;
proc print data=want;
run;

将返回

1 2
5 6

如果您想将3 4读入另一行,那么,您可以执行以下操作:

data want;
input a b @;
output;
input a b;
datalines;
1 2 3 4
5 6 7 8
run;
proc print data=want;
run;

这就产生了

1 2
3 4
5 6
7 8

类似地,你可以简单地写

data want;
input a b @@;
datalines;
1 2 3 4
5 6 7 8
run;
proc print data=want;
run;

为了得到相同的结果,@@甚至会在整个run语句中保持行指针。(一旦撞到终点,它仍然会前进。)

总结:在这种情况下,我认为您可能不想要尾随的@。Input语句似乎不适合您正在读取的数据。使用尾随的@,您将向var1和var3读取相同的数据,向var2和var4读取同样的数据,因为它将两次读取同一行。无论哪种方式,你都没有读取数据。你最好使用

input Var1 $ Var2 $ @;
input Var3 $ Var4 $;

或者,更简单地说:

input Var1 $ Var2 $ Var3 $ Var4 $;

SAS支持网站的官方详细信息,注释如下:http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000146292.htm

使用线路保持规范

行保持说明符将指针保持在时的当前输入记录

  • 数据记录由多个INPUT语句读取(尾随@)使用单个尾随@可以允许下一个INPUT语句从同一记录中读取

通常,DATA步骤中的每个INPUT语句读取一个新的数据记录输入缓冲器。当您使用尾随@时发生:

  • 指针位置不变
  • 没有新记录被读入输入缓冲区
  • DATA步骤的相同迭代的下一个INPUT语句继续读取相同的记录,而不是新的记录

当时,SAS释放由尾随@保持的记录

  • 一个null INPUT语句执行:投入
  • 没有尾随@的INPUT语句执行
  • DATA步骤的下一次迭代开始

最新更新