BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
s-mac
Obsidian | Level 7

とあるデータテーブル内の文字変数の型式を数値に変換したいと考えています。

下記のプログラムを実行したところ、文字→数値変換のinputNが上手く動作せず、

下記の警告が出てしまいます。マクロ変数nameの中には日本語の変数が入っています。

下記のソースコードが正しく動作する方法 or 複数の変数を一括で型式変更する方法があれば教えて頂きたいです。

 

★警告文

WARNING: %SYSFUNCまたは%QSYSFUNCマクロ関数で参照されている関数INPUTNの第1引数が正しい範囲にありませ
ん。

 

★実際のソースコード

proc sql print;
select name into :name separated by '~ ' from &_input1;
quit;
proc sql print;
select week into :week separated by '~ ' from &_input1;
quit;
proc sql print;
select count(*) into :table_num separated by '~ ' from &_input1;
quit;
%macro kata;
%do i=1 %to &table_num;
data &_output1;
set &_input2;
"%scan(&name, &i, ~)"n = %SYSFUNC(inputN(%scan(&name, &i, ~),6.));
%end;
%mend kata;
%kata;

1 ACCEPTED SOLUTION

Accepted Solutions
daipdo
Fluorite | Level 6

お世話になります。daipdoと申します。

実行していないので間違っているかもですが、最後のデータステップ部分の"%scan(&name, &i, ~)"n = %SYSFUNC(inputN(%scan(&name, &i, ~),6.));が問題と思います。errorもそこで出ておりますし。以下気になった部分二つを列挙します。

・SASの式の左辺に"%scan(&name, &i, ~)"nを持ってくる…つまり式の左辺に関数を置くことをやったことが無いのでどういう挙動になっているかがわかりませんが、この部分って意図通りの物が出来ておりますでしょうか

・%SYSFUNC(inputN(%scan(&name, &i, ~),6.))のinputn関数の引数に%scanを当てていますが、これがerrorの直接の原因と思います。おそらくマクロ変数nameを~で分解した際に、分解後の文字列の前後に"が残っているのだと思います。多分…最終的にinputnの第一引数に”で挟まれた文字列が残っているので書いておられるerrorが出ていると予想します。

 

以下が私なりに最後のデータステップ部分を修正したものになります。inputnの関数をしている部分の左辺と右辺の内容を格納したマクロ変数を作成し、inputnの部分ではあくまでそれぞれのマクロ変数を記載する形にしています。(_inと_out)

多分こうすれば式の右辺に関数を置くことなく、また式の左辺でsysfuncを使うこともなくなると思います。

マクロkataをこのマクロhogeに置き換えて、_nameの設定部分とかお試しの変数とかを消したり、マクロ変数の名前を良い感じに変えてもらえれば大丈夫と思います…きっと…

 

%macro hoge() ;

  /*対象の変数群が入ったマクロ変数*/
  %let _name = hoge1~hoge2~hoge3 ;
  %put &=_name ;

 

%do i = 1 %to 1 ;

/*対象の変数群からi番目の変数名をマクロ変数に格納*/
%let _in = %sysfunc( scan(&_name , &i , ~) ) ;

/*i番目の変数名の末尾にnを付加してマクロ変数に格納*/
%let _out = %sysfunc( cats( &_in , n ) ) ;

%put &=_in ;
%put &=_out ;

 

data _null_ ;

/*変数のtest値をset ここはお試しなので消しても良い*/
hoge1 = "20,000.00" ;
hoge2 = "10,000.00" ;
hoge3 = "30,000.00" ;

 

/*数値に変換*/
&_out = inputn( &_in , "comma10.2") ;

 

/*変数名の形をV_CHに格納 N/C 今回は数値に変換しているのでN*/
V_CH = vtype(&_out.) ;
putlog &_out V_CH ;

run ;


%end ;

%mend hoge ;

 

View solution in original post

2 REPLIES 2
s-mac
Obsidian | Level 7
補足としてこちらSAS Studioを使っています。
daipdo
Fluorite | Level 6

お世話になります。daipdoと申します。

実行していないので間違っているかもですが、最後のデータステップ部分の"%scan(&name, &i, ~)"n = %SYSFUNC(inputN(%scan(&name, &i, ~),6.));が問題と思います。errorもそこで出ておりますし。以下気になった部分二つを列挙します。

・SASの式の左辺に"%scan(&name, &i, ~)"nを持ってくる…つまり式の左辺に関数を置くことをやったことが無いのでどういう挙動になっているかがわかりませんが、この部分って意図通りの物が出来ておりますでしょうか

・%SYSFUNC(inputN(%scan(&name, &i, ~),6.))のinputn関数の引数に%scanを当てていますが、これがerrorの直接の原因と思います。おそらくマクロ変数nameを~で分解した際に、分解後の文字列の前後に"が残っているのだと思います。多分…最終的にinputnの第一引数に”で挟まれた文字列が残っているので書いておられるerrorが出ていると予想します。

 

以下が私なりに最後のデータステップ部分を修正したものになります。inputnの関数をしている部分の左辺と右辺の内容を格納したマクロ変数を作成し、inputnの部分ではあくまでそれぞれのマクロ変数を記載する形にしています。(_inと_out)

多分こうすれば式の右辺に関数を置くことなく、また式の左辺でsysfuncを使うこともなくなると思います。

マクロkataをこのマクロhogeに置き換えて、_nameの設定部分とかお試しの変数とかを消したり、マクロ変数の名前を良い感じに変えてもらえれば大丈夫と思います…きっと…

 

%macro hoge() ;

  /*対象の変数群が入ったマクロ変数*/
  %let _name = hoge1~hoge2~hoge3 ;
  %put &=_name ;

 

%do i = 1 %to 1 ;

/*対象の変数群からi番目の変数名をマクロ変数に格納*/
%let _in = %sysfunc( scan(&_name , &i , ~) ) ;

/*i番目の変数名の末尾にnを付加してマクロ変数に格納*/
%let _out = %sysfunc( cats( &_in , n ) ) ;

%put &=_in ;
%put &=_out ;

 

data _null_ ;

/*変数のtest値をset ここはお試しなので消しても良い*/
hoge1 = "20,000.00" ;
hoge2 = "10,000.00" ;
hoge3 = "30,000.00" ;

 

/*数値に変換*/
&_out = inputn( &_in , "comma10.2") ;

 

/*変数名の形をV_CHに格納 N/C 今回は数値に変換しているのでN*/
V_CH = vtype(&_out.) ;
putlog &_out V_CH ;

run ;


%end ;

%mend hoge ;