我有以下程序,但不明白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步骤的下一次迭代开始