2012-01-27 52 views
4

SAS中有一種簡單的方法將字符串轉換爲可用作列名的SAS安全名稱嗎?SAS安全列名稱

即。

Rob Penridge ----> Rob_Penridge 

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

我使用的是proc transpose,然後想在轉置後使用重命名的列。

回答

5

proc transpose將這些名稱沒有任何修飾,只要你設置options validvarname=any;

如果你想以後用列工作,你可以使用NLITERAL功能來構建名爲文字可以用來指他們:

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

完美 - 謝謝! – 2012-01-31 18:23:48

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使用有效名稱的規則,儘管如此謝謝=) – 2012-01-30 15:28:03

0

您也可以在轉置中使用IDLABEL語句來添加與原始值匹配的標籤。然後使用VARLABEL函數檢索標籤並以這種方式處理它們。