0

ここからコードを使用しようとしていますが、正しく適応させる方法がわかりません。 https://communities.sas.com/thread/33654?start=0&tstart=0

Rにインポートできるように、51個のSASデータセットをCSVファイルにエクスポートしようとしています。これが私が持っているマクロコードです(動作していません):

libname g 'C:\mylibrary';
%macro export(libname, numvars= &numvars.);
  %do i= 1 %to &numvars.;
    proc export data=&libname.StateZip&i
      DBMS=CSV REPLACE 
      outfile= "&libname.StateZip&i.csv"; 
      run;
  %end;
%mend;

%export(&g, numvars= 51);

これが私が得ているエラーメッセージです:

NOTE: Writing TAGSETS.SASREPORT12(EGSR) Body file: EGSR
13         
14         GOPTIONS ACCESSIBLE;
ERROR: Invalid macro name (.  It should be a valid SAS identifier no longer than 32 characters.
ERROR: A dummy macro will be compiled.
15         %macro export(libname, numvars= &numvars.);
16          %do i= 1 %to &numvars.;
17              proc export data=&libname.StateZip&i
18                  DBMS=CSV REPLACE
19               outfile= '&libname.StateZip&i.csv';
20               run;
21          %end;
22         %mend;
23         
24         %export(g, numvars= 51);
24        +(libname, numvars= &numvars.);
           _
           10

ERROR 10-205: Expecting the name of the procedure to be executed.

24        +(libname, numvars= &numvars.);
           _
           180
ERROR 180-322: Statement is not valid or it is used out of proper order.
2                                           The SAS System          11:38 Wednesday, September 5, 2012



180: LINE and COLUMN cannot be determined.
NOTE: NOSPOOL is on. Rerunning with OPTION SPOOL may allow recovery of the LINE and COLUMN where the 
      error has occurred.

あなたが提供できる助けをいただければ幸いです。

4

1 に答える 1

2

&numvars への再帰参照があります。これはそれ自体が問題ですが、重大な問題ではありません。つまり、デフォルト値が意図した値ではなく null になることを意味します。そうでなければ、あなたのコードは私にとってはうまくいきます。%macro の定義の直前に何か問題があると思います。あなたが投稿したエラーは、正しく解決されていないトークンを持っているように見えるため、 %macro export( の代わりに

あなたは %macro (

とにかく、これは私のために働くものです:

%let g=c:\temp;
libname g "&g.";
%macro export(libname, numvars=);
  %do i= 1 %to &numvars.;
    proc export data=sashelp.class
      DBMS=CSV REPLACE 
      outfile= "&g.\StateZip&i.csv"; 
      run;
  %end;
%mend;

%export(&g, numvars= 51);

変更した点: * libname と一緒に使用するには、%let g= が必要です。あなたはそれを定義していませんが、おそらく他の場所で定義しています。* これらのデータセットがないため、ライブラリを使用する代わりに Sashelp.class を使用します。

ただし、より良い答えは、おそらくこのようにして、FILEVAR オプションを使用して自分で書き出すことです。大量の変数がある場合でも、put ステートメントをプログラムで特定するか、1 つの proc export を実行してログからコピーするだけです。これにより、すべてのマクロが回避され、51 の異なるデータセットを作成する必要がなくなります。標識変数を使用して作成するだけです。何をしていても、これは (PROC を使用した BY グループ処理などを使用して) 高速であり、さまざまなデータセットを多数用意してマクロで補うよりもエラーが発生しにくくなります。

data have_51;
set sashelp.class;
do _n = 1 to 51;
output;
end;
run;

*I assume you have have_51 already;

data want;
set have_51;
filename=cats("&g.\StateZip",_n,".csv");
run;

proc sort data=want;
by filename;
run;

data _null_;
set want;
file a filevar=filename dlm=',' lrecl=500;
put
name $
age
height
weight
;
run;
于 2012-09-05T17:15:22.827 に答える