Значение макропеременной как длина другой переменной?

Я новичок в SAS и не нашел ответа на свой вопрос. Может быть, это сообщество будет / может быть настолько добрым, чтобы помочь мне.

Можно ли определить значение макропеременной как длину другой переменной? Я знаю, что значением макроса является символ, но есть ли способ сделать это?

Моя проблема заключается в следующем: я хочу проверить свою переменную на самое длинное значение и установить длину самого длинного значения в качестве новой длины для переменной. Поэтому я использовал эту программу:

proc sql;

select max(length(variable))

into: length_variable

from dm_comp;
quit;

%put length_variable;

Теперь у меня есть значение как символ в моем макросе, но я не знаю, как использовать этот макрос для установки новой длины. Возможно ли это сделать таким образом? Если нет, то есть ли у вас идея, как это сделать лучше? Большое спасибо за Вашу помощь.


person Kris    schedule 22.04.2016    source источник


Ответы (2)


Вы можете использовать шаг данных, чтобы переопределить переменную и заполнить ее из старого набора данных.

/*Data with variable length 10, only need 2*/
data temp;
length x $ 10;
x="1";
output;
x="11";
output;
run;

proc sql noprint;
select max(length(x))
    into: length_variable
from temp;
quit;

/*Puts 2 as expected*/
%put &length_variable;

/*First define the variable and the new length,
  Then "set" the Data step - rename the old variable.
  Set the new variable to the old one (I strip whitespace here)*/
data temp(drop=x_old);
length x $ &length_variable;
set temp(rename=(x=x_old));
x = strip(x_old);
run;

/*CONTENTS Show us the new length*/
proc contents data=temp;
run;

Полученные результаты

                  Alphabetic List of Variables and Attributes

                         #    Variable    Type    Len

                         1    x           Char      2
person DomPazz    schedule 22.04.2016
comment
Я не думаю, что вам нужна часть переименования (x = x_old) или оператор присваивания. Просто добавление оператора длины перед оператором SET будет работать. Он выдаст предупреждение об усечении значения, чего можно избежать, установив системную опцию varlenchk=nowarn; - person Quentin; 22.04.2016
comment
@Квентин, ты прав. Я сделал это таким образом, чтобы избежать ПРЕДУПРЕЖДЕНИЯ в журнале без изменения параметров системы. - person DomPazz; 22.04.2016
comment
Большое спасибо за Вашу помощь. Это работает. Теперь, что, если я хочу поместить свой код в макрос, если я хочу использовать его повторно? ‹br/› - person Kris; 25.04.2016
comment
Мне очень жаль, я до сих пор не знаю, как правильно редактировать и кодировать на этом веб-сайте. Я хотел создать такой макрос: %macro sql (var,dataset); процедура sql; выберите max(length(&var)) в: l_&var from quit; % исправить; к сожалению, он не разрешает макрос &l_&var, и я не знаю почему. - person Kris; 25.04.2016
comment
Это действительно другой вопрос. Короткий ответ: попробуйте &&l_&var. Задайте другой вопрос, если вам нужен подробный ответ, почему. - person DomPazz; 25.04.2016

Вы на правильном пути. Вам просто нужно правильно отформатировать новую переменную:

proc sql;
    select max(length(variable))
    into: length_variable
    from dm_comp;
quit;

proc sql;
    create table dm_comp2 as select
        *, your_var as resized_var format %sysfunc(strip(&length_variable.)).
        from dm_comp;
quit;
person Sean    schedule 22.04.2016
comment
Изменение формата отличается от изменения длины. Формат влияет на то, как будут отображаться значения. Длина влияет на то, как они хранятся. Я думаю, вы хотели бы your_var as resized_var length &length_variable - person Quentin; 22.04.2016