Условный оператор Infile
Возможно ли использовать оператор infile для условного присвоения значения чтения тому или иному столбцу в наборе данных, который будет создан, в зависимости от значения?
data test;
infile '&filename' delimiter = ',' missover dsd lrecl 32767 firstobs = 2;
informat var_one 2.;
informat var_two $4.;
format var_one 2.;
format var_two $4.;
input
if length(item in question) = 2 then
var_one
else
var_two $;
run;
В приведенном выше коде "рассматриваемый элемент" заполняет пробел в знаниях и в основном означает назначение считываемого значения одному или другому столбцу в зависимости от его длины.
Очевидно, вы можете видеть, что у меня нет полного правильного синтаксиса, но кто-то может подсказать мне, что мне нужно изменить, и если это вообще возможно?
Спасибо
2 ответа
Простейшим способом было бы ввести его во временную переменную, а затем выбрать на основе этого.
data test;
infile '&filename' delimiter = ',' missover dsd lrecl 32767 firstobs = 2;
informat var_one 2.;
informat var_two $4.;
format var_one 2.;
format var_two $4.;
input temp $;
if length(temp) = 2 then var_one=input(temp,2.);
else var_two = temp;
run;
Конечно, вы могли бы сделать это и на входе.
data test;
infile '&filename' delimiter = ',' missover dsd lrecl 32767 firstobs = 2;
informat var_one 2.;
informat var_two $4.;
format var_one 2.;
format var_two $4.;
input @; *start inputtingl
if length(scan(_infile_,1,',')) = 2 then
input var_one;
else
input var_two $;
run;
Но я считаю, что первый метод немного проще, так как вам не нужно его сканировать.
Ваша проблема действительно не похожа на то, что нужно условно запустить INFILE
заявление. Обычно это включает изменение файла для чтения или, возможно, изменение используемого разделителя.
Вы можете, конечно, условно запустить INPUT
заявление. Обычно это делается, когда входной поток имеет много разных типов записей. Вы прочитали достаточно записи, чтобы определить тип, удерживая строку с завершающим @
, Затем на основе типа записи вы читаете различные переменные из строки.
input rectype $ @ ;
if rectype='1' then input @1 rectype name age gender;
else input @1 rectype company_name job_title ;
Но ваша проблема больше похожа на то, что вы бы просто обработали с помощью условно выполняемых операторов присваивания. Сначала прочитайте его в строку символов и проверьте его длину. Исходя из этого, вы можете решить, в какую переменную его сохранить.
length temp $10 var_one 8 var_two $4 ;
input temp ;
if length(temp)<=2 then var_one = input(temp,2.);
else if length(temp) < 4 then var_two=temp;
else put 'WARING: Length too long.' temp= $quote. ;
Или просто прочитайте его в символьную строковую переменную и преобразуйте в число. Вы можете подавить ошибки преобразования, используя ?
или же ??
модификаторы, так что SAS автоматически установит числовую переменную в значение пропущенного, если строка не похожа на число.
length var_one 8 var_two $4 ;
input var_two ;
var_one = input(var_two, ??2.);
Вы можете даже исключить строку символов, если значение действительно выглядит как число.
if not missing(var_one) then call missing(var_two);