2016-11-09 14 views
1

私はPROC手段とStackODSOutputオプションを使用するのに奇妙な問題があります。この例を考えてみましょう。SAS PROCは、StackODSOutputを使用しています:「ラベル」という変数です

まず、解析用のダミーデータセットを作成します。

/* Step-1: Create a dummy dataset for analysis */ 
data ds1; 
    label x = 'Variable X'; 
    label y = 'Variable Y'; 
    do i = 1 to 100; 
     x = ranuni(1234); 
     y = ranuni(5678); 
     keep x y; 
     output; 
    end; 
run; 

次に、StackODSOutputオプションを指定してPROC MEANSを実行します。これにより、 "stats"という出力データセットが作成されます。

/* Step-2: I run PROC means to capture the output in a dataset called stats */ 
proc means data=ds1 StackODSOutput mean; 
    var x y; 
    ods output summary=stats; 
run; 

この「統計」データセットには「ラベル」という変数があります。私はprocの内容を行うので変数が存在することを知っています、そして、変数をそこに見ます。

/* Step-3: Confirm visually that there is a variable called Label in stats dataset */ 
proc contents data=stats varnum; run; 

ただし、「ラベル」という名前のこの変数はどこでも参照できません。たとえば、次のPROC SQL文はエラーを生成します。私は "Stats"データセットの他のすべての変数を何の問題もなく参照することができます。次のように

/* Step-4: But, I cannot seem to reference the variable called "Label" in stats dataset! */ 
proc sql; 
    select Variable, Label from stats; 
quit; 

エラーがある:私は何か間違ったことをやっている場合

43   proc sql; 
44   select Variable, Label from stats; 
ERROR: The following columns were not found in the contributing tables: Label. 
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements. 
45   quit; 

あなたは知っていますか?私のSASコードまたはSASのインストールに何か問題がありますか?

MY SASバージョンはSAS 9.3(9.03.01M2P08152012)です。

ありがとうございました。

Karthik。

Reezaの要請に応じて、ここには完全なログ出力があります。

1               The SAS System       15:52 Wednesday, November 9, 2016 

1   %_eg_hidenotesandsource; 
5   %_eg_hidenotesandsource; 
20   
21   /* Step-1: Create a dummy dataset for analysis */ 


22   data ds1; 
23   label x = 'Variable X'; 
24   label y = 'Variable Y'; 
25   do i = 1 to 100; 
26    x = ranuni(1234); 
27    y = ranuni(5678); 
28    keep x y; 
29    output; 
30   end; 
31   run; 

NOTE: The data set WORK.DS1 has 100 observations and 2 variables. 
NOTE: DATA statement used (Total process time): 
     real time   0.01 seconds 
     cpu time   0.01 seconds 


32   
33   /* Step-2: I run PROC means to capture the output in a dataset called stats */ 
34   proc means data=ds1 StackODSOutput mean; 
35   var x y; 
36   ods output summary=stats; 
37   run; 

NOTE: The data set WORK.STATS has 2 observations and 3 variables. 
NOTE: There were 100 observations read from the data set WORK.DS1. 
NOTE: PROCEDURE MEANS used (Total process time): 
     real time   0.06 seconds 
     cpu time   0.03 seconds 


38   
39   /* Step-3: Confirm visually that there is a variable called Label in stats dataset */ 
40   proc contents data=stats varnum; run; 

NOTE: PROCEDURE CONTENTS used (Total process time): 
     real time   0.03 seconds 
     cpu time   0.03 seconds 


41   
42   /* Step-4: But, I cannot seem to reference the variable called "Label" in stats dataset! */ 
43   proc sql; 
44   select Variable, Label from stats; 
ERROR: The following columns were not found in the contributing tables: Label. 
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements. 
45   quit; 
NOTE: The SAS System stopped processing this step because of errors. 
NOTE: PROCEDURE SQL used (Total process time): 
     real time   0.00 seconds 
     cpu time   0.00 seconds 

2               The SAS System       15:52 Wednesday, November 9, 2016 

46   /* What! */ 
47   
48   
49   
50   %_eg_hidenotesandsource; 
62   
63   
64   %_eg_hidenotesandsource; 
67   
+0

コードが私のために正常に動作します。一度にすべてを実行してもう一度チェックしてください。おそらくどこかで何かを忘れたかもしれません。 SASのどのバージョンを使用していますか?私は9.4 TS1M3です。まだ動作していない場合は、実行中のコードからフルログを1回実行してください。 – Reeza

+0

私のSASバージョンはSAS 9.3(9.03.01M2P08152012)です。また、SASの全ログを追加しました。 – Karthik

+0

'option validvarname = v7;'を設定してみてください。始めにやり直してください。何も行っていなければ、procの内容を出力してください。私はテクニカルサポートでこれを提起することも提案します。既知の問題の場合は、正しい方向に向けることができます。または少なくともそれを追跡することができます。 – Reeza

答えて

1

これはバグです。末尾の空白を含む変数名を作成します。これは、validvarnameがANYに設定されている場合にEGで可能です。

修正:

Option validvarname=V7; 

https://communities.sas.com/t5/SAS-Enterprise-Guide/SAS-EG-won-t-recognize-a-variable-that-has-the-name-quot-Label/m-p/294936

+0

これで問題は解決しました。基本的には、 "Option validvarname = V7;"を追加する必要があります。私はPROC MEANSを呼び出して、デフォルトの "Option validvarname = any;"に戻します。その後。ありがとう! – Karthik

1

私はコード実行時と同じ問題があります。私はSAS 9.4を持っていて、Linuxで走っています。ここでは、問題の私の評価は私の終わりです:

data _NULL_; 
    set stats; 
    put _all_; 
run; 

は、それはそうかなりとして「ラベル」の変数名ではないことを示しています

22   data _NULL_; 
23   set stats; 
24   put _all_; 
25   run; 

Variable=x Label =Variable X Mean=0.461116 _ERROR_=0 _N_=1 
Variable=y Label =Variable Y Mean=0.525342 _ERROR_=0 _N_=2 

お知らせ変数名「ラベル」の間にスペースをと等しい文字。他の変数はこのようには見えません。変数の名前が壊れている可能性があります。

別のテーブルにdictionary.columnsテーブルから変数名をロードし、値を見て:

proc sql; 
    create table x as 
    select name as nm from dictionary.columns 
    where libname = 'WORK' and memname = 'STATS'; 
quit; 

data _NULL_; 
    set x; 
    put nm= nm $hex32.; 
run; 

$HEX32.形式がASCIIコードにテキストを翻訳するので、そこに任意の印刷できない文字があるかどうかを確認することができます。

22   data _NULL_; 
23   set x; 
24   put nm= nm $hex32.; 
25   run; 

nm=Variable 5661726961626C652020202020202020 
nm=Label 4C6162656C0000002020202020202020 
nm=Mean 4D65616E202020202020202020202020 

ラベル変数を見ると、最初にギャップがまだ次の出力との間に表示されます。進コードは、いくつかの繰り返しゼロが含まれています

4C6162656C0000002020202020202020

4C=L 
61=a 
62=b 
65=e 
6C=l 
00=? 
20=<space> 

だから、それが問題を引き起こしている「ラベル」変数名でこれらのASCIIゼロです。 SASはこれを「ラベル」としてのみ表示することができ、これらのASCIIゼロ(a.k.a ASCII NULL)はスペースとして表示されます。

修正

私は、私たちは何ができるのか、列の名前を変更され、ASCII特殊文字を含む列を参照する方法を認識していませんよ。しかし、「ラベル」は名前で参照することはできませんので、間接的に参照する必要があります。 1つの方法は配列を使用しています:

data stats_fix; 
    set stats; 
    array c{*} _CHARACTER_; 
    var=c[1]; 
    Label=c[2]; 
run; 

出力データセットを見るとかなり奇妙です。データセットには「ラベル」という2つの変数があります。 1つは「ラベル」で、もう1つは「Label000000」です。

PROC MEANSのバグとしてSAS Tech Supportでこれを引き上げる価値があるかもしれませんが、好きなだけこの答えの多くを自由に使用してください。

関連する問題