2013-03-11 1 views
2

У меня есть файл, в котором первая строка является строкой заголовка, содержащей некоторую информацию метаданных.Получить текущий счетчик отсчетов в SAS

Как получить текущий номер наблюдения (скажем = 1 для первого наблюдения), с которым работает процессор SAS, чтобы я мог помещать предложение 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

Если вы действительно хотите избежать выполнения этого, вы можете просто выбросить весь оператор ввода в один цикл внутри одного файла данных. Я думаю, что это плохая идея разделить его на два шага данных с интерфейсом макропеременной между ними - слишком много, что может пойти не так. – Joe

+0

В случае больших файлов, больно ли (по производительности) открывать - закрывать, а затем снова открывать один и тот же файл? Будет ли компилятор SAS интеллектуально открыть часть входного файла (в случае использования OBS = 1) и прочитать поток, если такое условие не предусмотрено? – user673218

 Смежные вопросы

  • Нет связанных вопросов^_^