2016-08-12 6 views
2

マクロ変数&myfilesには4つのデータセットの名前のリストが含まれています。マクロ変数に基づいて複数のsasデータセットをコピー/名前を変更する

%put &myfiles; 
cpo.CDR_2016jun cpo.Cog_2016jun cpo.Mile_2016jun cpo.Path_2016jun 

cpoはlibnameです。

data &New_Datasets; 
    set &myfiles; 
run; 
:私はちょうどこのようなデータステップを使用しようとした

%put &New_Datasets; 
CDR Cog Mile Path 

は私が&New_Datasetsと名付けました別のマクロ変数から名前を持つ4つの新しいデータセットを作成しようとしています

であるが、&mylistで参照されている4つのデータセットのすべての観測結果が組み合わされて、&New_Datasetsで参照されている4つのデータセットに入れられ、ログからの出力は

NOTE: There were 1482 observations read from the data set CPO.CDR_2016JUN. 
NOTE: There were 1444 observations read from the data set CPO.COG_2016JUN. 
NOTE: There were 255 observations read from the data set CPO.MILE_2016JUN. 
NOTE: There were 7 observations read from the data set CPO.PATH_2016JUN. 
NOTE: The data set WORK.CDR has 3188 observations and 1580 variables. 
NOTE: The data set WORK.COG has 3188 observations and 1580 variables. 
NOTE: The data set WORK.MILE has 3188 observations and 1580 variables. 
NOTE: The data set WORK.PATH has 3188 observations and 1580 variables. 

私は何を達成したいことは、データを作成cpo.cdr_2016junから1482回の観測を持つことであるセット1482の所見としてwork.cdrように、で参照するものの組み合わせではなく、新しいデータセットのそれぞれを持つよりも、 setステートメント。どんな助けでも大変感謝します。ありがとう!

+1

マクロ変数がない場合は、必要なデータセットを作成するのにどのSASコードを使用しますか?生成したいコードが分かれば、それを生成するためにマクロロジックを使用する方が簡単です。 – Tom

答えて

2

macrovariablesの値をループし、データステップまたはprocコピーを呼び出すマクロプログラムを作成する必要があります。

マクロ:

%macro rewriteDataSets(source_tables=, dest_tables=); 
    %local ii num_source_tables num_dest_tables source_name dest_name; 

    %let num_source_tables = %sysfunc(countw(&source_tables, %str())); 
    %let num_dest_tables = %sysfunc(countw(&dest_tables , %str())); 

    %if &num_source_tables ne &num_dest_tables %then %do; 
     %put ERROR: The number of source and destination tables must be the same in the call to rewriteDataSets; 
     %abort cancel; 
    %end; 

    %do ii=1 %to &num_source_tables; 

     %let source_name = %scan(&source_tables, &ii, %str()); 
     %let dest_name = %scan(&dest_tables , &ii, %str()); 

     data &dest_name; 
     set &source_name; 
     run; 

    %end; 
%mend rewriteDataSets; 

使用例:

%rewriteDataSets(source_tables = sashelp.class sashelp.class, 
       dest_tables = a b); 

または指定したテーブルを使用して、あなたはこのようにそれを呼び出します。

%rewriteDataSets(source_tables = cpo.CDR_2016jun cpo.Cog_2016jun cpo.Mile_2016jun cpo.Path_2016jun, 
       dest_tables = CDR Cog Mile Path); 

かを使用の代わりにデータステップ。

+0

これは、マクロ%revriteDatasets&myfilesおよび&New_Datasetsを切り替える必要のある小さな編集で機能します。ありがとう! –

+0

私はこれが大好きですが、グローバルマクロ変数は使用しないでください。 '&myfiles'と'&new_datasets'をパラメータとして渡します。 – Joe

+0

私はコードを少し更新して、それがどのように機能するのかを簡単に見て(マクロで経験の少ない方にとって)、基本的なエラーチェックも追加しました。 –

3

私は少し違った私のマクロ変数を定義し、このような何かをするだろう:

%let oldnames = CDR_2016jun Cog_2016jun Mile_2016jun Path_2016jun; 
%let newnames = CDR Cog Mile Path; 

proc datasets lib = cpo noprint; 
    copy out = work; 
    select &oldnames; 
    run; 
quit; 

%macro changes; 
%local i; 
%do i = 1 %to %sysfunc(countw(&oldnames)); 
    %scan(&oldnames, &i, %str()) = %scan(&newnames, &i, %str()) 
%end; 
%mend changes; 

proc datasets lib = work noprint; 
    change %changes; 
    run; 
quit; 

また、あなたがcpoで、元のデータセットのworkでビューを作成することができます。

+0

答えをいただきありがとうございます。私はこれを使用するにはまだprocデータセットに慣れていませんが、それを調べます。私の評判が十分に高いなら、私はあなたにアップフォートを与えるでしょう。 –

+0

@RMontgomeryデータセットの名前を変更する必要がある場合、 'proc datasets'が最速の方法です。コピーの場合は 'proc copy'または' proc datasets'を 'copy'文で置き換えます。書き換え中にロジックを実装すると、 'data step'。しかし、あなたのような小さなデータセットでは、それに集中する必要はありません。あなたに最も適した方法を選んでください。 – fl0r3k

+0

@ fl0r3k情報ありがとう、私は現在procデータセットについて読んでいます。私は現在のプロセスを合理化するために、このコードをはるかに大きなデータセットで使用しますので、余分な効率が望ましいかもしれません。私は読んで、感謝し続ける必要があります! –

関連する問題