2016-04-22 29 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文の前にlength文を追加するだけです。値を切り捨てることについての警告が表示されます。システムオプションvarlenchk = nowarnを設定することで回避できます。 – Quentin

+0

@Quentin、あなたは正しいです。システムオプションを変更しなくても、ログに警告が表示されないようにしました。 – 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

関連する問題