2013-03-12 2 views
3

Я новичок в SAS и с трудом выясняю, когда должно быть простое If-Then-else и когда должно быть использовано% IF-% THEN-% ELSE. В качестве примера кода ниже:Когда использовать IF или% IF в SAS

%let inFile = %scan(&sysparm, 1, " "); 
%macro read_data(infile); 
data want; 
infile "&infile" LRECL=1000; 
retain fdate; 
if _n_ = 1 then do; 
    input Agency $ Status $ Num $ fdate sdate; 
end; 
else do; 
    %if fdate < 20130428 %then 
    input 
    @1 poolno     $6. 
    @7 factor     9.8 @; 
    %else 
    input 
    @1 rectype     $1 
    @3 poolno     $6. 
    @9 factor     9.8 @; 

    @18 pfactor     9.8; 
output; 
end; 
drop Agency Status Num sdate; 
run; 
proc print data=want; 
run; 
%mend read_data; 
%read_data(&inFile); 

Я пытаюсь получить первую строку (заголовок) и принять параметр fdate. Основываясь на значении этого параметра, я анализирую последующие строки ввода по-разному. Но это не работает, поскольку работает только вторая входная часть (всегда получая параметр «rectype» на выходе).

Любые предложения, как я могу ошибаться?

ответ

0

В приведенном выше примере условие% IF основано на переменной/значении datastep. Это должно указывать на то, что это может быть достигнуто с использованием datastep 'if', а не% IF.

Вы уже получили ответ на это в предыдущем вопросе, https://stackoverflow.com/a/15341502/108797

0

Если вы %if fdate < 20130428 SAS сравнивает литералов fdate20130428 и не значение од fdate и 20130428.

Если у вас была переменная макроса с именем fdate, вы бы сделали %if &fdate < 20130428.

В вашем случае fdate является переменной в наборе данных, поэтому используйте if не %if, но кажется, что вы пытаетесь создать шаг данных с помощью макроса так просто используя if, вероятно, не работает в этом случае (в зависимости от что вы пытаетесь получить).

2

Я вижу, что у вас есть C++ как один из ваших тегов, и что вы только начинаете с SAS. Поэтому я постараюсь дать ответ на ваш вопрос.

Самый простой способ понять различие между SAS макрокоманд и команды в шаге DATA или в нескольких проки с таким же названием, как %, если VS. если, чтобы думать о макрокоманд SAS, как эквивалентно предпроцессорам C/C++ (CPP). CPP и SAS MAcro - оба макроязыка, и хотя они не совсем то же, что и язык, они разделяют две важные и изначально запутывающие характеристики: они - текстовые процессоры; и они выполняются как отдельный шаг до обработки основного кода.

Есть места, где это приближение ломается, но как новичок в SAS с фоном на C/C++, это хорошее место для начала.

1

Оператор макроса% if скомпилирован перед любой инструкцией шага данных. Это означает, что вы, как правило, не можете использовать переменную шага данных в своем логическом выражении. Когда макропроцессор компилирует оператор макроса, переменная шага данных еще не существует.