2017-02-13 122 views
0

我有以下方案,但不明白@在输入行的结束符号作用:没有@生产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

总结:我认为你可能不希望在这种情况下尾随@。输入语句似乎不适合您正在阅读的数据。在尾部@处,您正在将相同的数据读入到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

使用线保持说明符

Line-hold specifi ERS保持指针上 当前输入记录时

  • 的数据记录是由多于一个输入的语句(后@) 使用单尾@允许下一个输入语句,从同一个记录读读。

通常,DATA步骤中的每个INPUT语句都会将新数据记录 读入输入缓冲区。当您使用尾随@时,将出现以下 :

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

SAS释放一个尾部@保留的记录时

  • 一个空的输入语句执行: 输入;
  • INPUT语句没有尾随@执行
  • DATA步骤的下一次迭代开始。
2

@input表态意味着结束,不分号后推进线指针。@@表示不会在运行语句之后超前行指针。

通常,输入语句在分号后有一个隐含的提前行指针一个。所以:

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语句。 (一旦到达线的末端,它仍然会前进。)