0

特定の変数が 2000 文字を超える長さとして定義されているデータ セットのグループがあります。私がやりたいことは、これらの変数を識別し、値を保持する新しい変数のセットを作成するマクロを作成することです。

ベースコードでこれを行うと、次のようになります。

data new_dset;
set old_dset:
length colnam1 colnam2 colnam3 2000.;
colnam1 = substr(long_column,1,2000);
colnam2 = substr(long_column,2001,2000);
run;

変数名と長さのリストをマクロ変数のセットとして作成できますが、マクロ変数から新しい変数を作成する方法がわかりません。

私が考えていたのは、次のようになります。

%macro split;

data new_dset;
set old_dset;
%do i = 1%to &num_cols;

   if &&collen&i > 2000 then do;

      &&colnam&i 1 = substr(&&colnam&i,1,2000);
   end;
%en;
run;
%mend;

うまくいかないことはわかっていますが、それが私の考えです。

誰かが私がこれを行う方法を理解するのを手伝ってくれるなら、私はとても感謝しています.

ありがとう

ブライアン

4

1 に答える 1

1

マクロは、データ ステップ全体である必要はありません。この場合、複製しているものを正確に確認し、それに基づいてマクロを作成すると便利です。

あなたのコードは次のとおりです。

data new_dset;
set old_dset:
length colnam1 colnam2 colnam3 2000.;
colnam1 = substr(long_column,1,2000);
colnam2 = substr(long_column,2001,2000);
run;

マクロは次のようにする必要があります。

length colnam1 colnam2 colnam3 2000.;
colnam1 = substr(long_column,1,2000);
colnam2 = substr(long_column,2001,2000);

だからあなたができることは、それをマクロに入れることです:

%macro split(colname=);
 length &colname._1 &colname._2 $2000;
 &colname._1 = substr(&colname.,1,2000);
 &colname._2 = substr(&colname.,2001,4000);
%mend;

次に、呼び出しのリストを生成します。

proc sql;
 select cats('%split(colname=',name,')') into :calllist separated by ' '
  from dictionary.columns 
  where libname = 'WORK' and memname='MYDATASET'
  and length > 2000;
quit;

次に、それらを実行します。

data new_dset;
set old_dset;
&calllist;
run;

これで完了です :) &calllist には、%split(colname) 呼び出しのリストが含まれています。2 つ以上の変数が必要な場合 (つまり、長さが 4000 を超える場合)、新しいパラメーター「長さ」を追加することをお勧めします。または、9.2 以降を使用している場合は、SUBSTR の代わりに SUBPAD を使用して、外部変数ごとに 3 つの変数すべてを生成できます。

于 2013-04-09T20:00:20.837 に答える