2016-04-22 4 views
1

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

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

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

proc sql; 

select max(length(variable)) 

into: length_variable 

from dm_comp; 
quit; 

%put length_variable; 

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

ответ

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 
+0

Я не думаю, что вам нужна часть переименования (x = x_old) или оператор присваивания. Просто добавьте оператор длины, прежде чем инструкция SET будет работать. Он выдает предупреждение об усечении значения, которое можно избежать, установив системный параметр varlenchk = nowarn; – Quentin

+0

@Quentin, вы правы. Я сделал это таким образом, чтобы избежать WARNING в журнале, не изменяя параметры системы. – DomPazz

+0

Большое спасибо за вашу помощь. Это работает. Теперь, если я хочу поместить мой код в макрос, если я хочу использовать его повторно?
Kris

0

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

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; 
+0

Изменение формата отличается от изменения длины. Формат влияет на то, как будут отображаться значения. Длина влияет на то, как они хранятся. Я думаю, вам нужно будет 'your_var как resized_var length & length_variable' – Quentin