2013-03-11 70 views
2

我有一个文件,其中第一行是包含一些元数据信息的标题行。获取SAS中的当前观察计数

如何获得SAS处理器正在处理的当前观察编号(比如说第一个观察值为1),以便我可以放入IF子句来处理此类特殊数据行。

后续行动:我想要处理第一行并将列值保留在局部变量中作进一步处理。我不想在最终输出中保留这一行。这可能吗?

回答

4

自动变量_N_返回SAS数据步进循环的当前迭代编号。对于传统的数据步骤,即:

data something; 
set something; 
(code); 
run; 

_N_相当于行号(因为一行的数据步骤循环的每次迭代中检索)。

所以,如果你想仅仅只做一次,在第一次循环,这将实现这一目标:

data something; 
set something; 
if _n_ = 1 then do; 
    (code); 
end; 
(more code); 
run; 

对于你的跟进,你想是这样的:

data want; 
set have; 
retain _temp; 
if _n_ = 1 then do; 
    _temp = x; 
end; 
... more code ... 
drop _temp; 
run; 

DROP和RETAIN语句可以出现在代码中的任何地方,并具有相同的效果,我将它们放在他们的人工逻辑位置。 RETAIN表示不要重置每次通过数据步进循环丢失的变量,以便您可以进一步访问它。

0

如果您正在阅读特别大的文本文件,您可能希望避免必须对每个迭代执行(if _n_=1 then)条件。您可以通过阅读该文件两次做到这一点 - 一旦提取标题行,并再次读取文件,如下所示:

data _null_; /* create dummy file for demo purposes */ 
file "c:\myfile.txt"; 
put 'blah'; output; 
put 'blah blah blah 666'; output; 

data _null_; /* read in header info */ 
infile "c:\myfile.txt"; 
input myvar:$10.; /* or wherever the info is that you need */ 
call symput('myvar',myvar);/* create macro variable with relevant info */ 
stop; /* no further processing at this point */ 

data test; /* read in data FROM SECOND LINE */ 
infile "c:\myfile.txt" firstobs=2 ; /* note the FIRSTOBS option */ 
input my $ regular $ input $ statement ; 
remember="&myvar"; 
run; 

对于短/简单的东西虽然乔的回答是更好,因为它更可读..(对于小文件可能更有效)。

+0

如果您确实想避免执行该操作,则可以将整个输入语句放入一个datastep中的单个循环中。我认为在两个数据步之间用一个宏变量接口将它分开是一个坏主意 - 太多可能会出错。 – Joe 2013-03-11 21:23:03

+0

在大文件的情况下,打开 - 关闭然后再打开同一个文件会伤害(性能方面)吗? SAS编译器是否智能地打开输入文件的一部分(在使用OBS = 1的情况下)并在没有提供这种条件的情况下读取流? – user673218 2013-03-13 07:19:31