我有一个文件,其中第一行是包含一些元数据信息的标题行。
如何获得SAS处理器正在处理的当前观察数(假设第一次观察= 1),以便我可以放入一个IF子句来处理这种特殊数据线。
跟进:我想处理第一行并将其中一个列值保存在局部变量中以便进一步处理。我不想在我的最终输出中保留这一行。这有可能吗?
答案 0 :(得分: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表示每次通过数据步骤循环都不会将变量重置为缺失,因此您可以进一步访问它。
答案 1 :(得分: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;
对于简短/简单的东西,Joe的答案更好,因为它更具可读性......(对于小文件可能更有效)。