2012-01-27 11 views
4

カラム名として使用されるSASセーフな名前に文字列を変換する簡単な方法はありますか?SASセーフカラム名

ie。

Rob Penridge ----> Rob_Penridge 

$*@'[email protected]* ----> ____Blah__ 

私はproc transposeを使用して、転置後の列の名前が変更された仕事をしたいんです。

答えて

5

proc transposeはあなたを参照するために使用することができますという名前のリテラルを構築するためにNLITERAL機能を使用することができ、限り、あなたは後で列を操作する場合は、options validvarname=any;

を設定すると、そのままその名前がかかりますそれらは:

options validvarname=any; 

/* Create dataset and transpose it */ 
data zz; 
    var1 = "Rob Penridge";  
    var2 = 5; 
    output; 

    var1 = "$*@'[email protected]*"; 
    var2 = 100; 
    output;   
run; 

proc transpose 
    data = zz 
    out = zz_t; 
    id  var1; 
run; 


/* Refer to the transposed columns in the dataset using NLITERAL */ 
data _null_; 
    set zz; 
    call symput(cats("name", _n_), nliteral(var1)); 
run; 

data blah; 
    set zz_t; 
    &name1. = &name1. + 5; 
    &name2. = &name2. + 200; 
run; 
+0

パーフェクト - ありがとう! –

2

perl正規表現機能を試してみてください。 カラム名のために、最初の文字は数値であってはならないので、もっと複雑です。

data _null_; 
name1 = "1$*@' [email protected]*"; 
name2 = prxchange("s/[^A-Za-z_]/_/",1,prxchange("s/[^A-Za-z_0-9]/_/",-1,name1)); 
put name2; 
run; 
1

SASのregular expression機能の使用はどうですか?たとえば:

data names; 
set name; 
name_cleaned = prxchange('s/[^a-z0-9 ]/_/i', -1, name); 
run; 

これは_に文字、数字、またはスペースではない何かを変換します。 9の後ろに、リストに許可したい他の文字を追加することができます。一部の文字は「特別」で、先頭には\が必要です。

2

VALIDVARNAMEシステムオプションを参照してください。有効でないSAS名を受け入れる可能性があります。

また、NOTNAME関数は、無効な文字の検索を容易にすることができます。

+0

+1のNOTNAMEを示します。これをループで使用していたかもしれませんが、正規表現のアプローチは簡単で簡潔です。私はSASが有効な名前に使用するルールを確認するために、この関数のドキュメントを使用しました。ありがとう=) –

0

転置でもIDLABELステートメントを使用して、元の値と一致するラベルを追加することができます。次に、VARLABEL関数を使用してラベルを取得し、その方法で作業します。