そのため、特定の変数のグループ化に基づいて、大きなデータセット (1,790 の変数を持つ 70,000 の obs) を分割しようとしています。Excel または CSV は、エクスポートするのに理想的な形式ですが、可変数 (260 など) には制限があります。SAS(またはR/SQL)でこれを行う方法はありますか?
マクロが機能することは知っています。以前に使用したことがあります。エラーメッセージは、変数の制限に達したことを示しています。
Excel ファイルの作成には確かに制限がありますが、CSV ファイルの作成には制限がありません。ダミーの SAS データセットを使用した例を次に示します。
data a;
array x(*) x1-x1790;
do j=1 to 5;
do i=1 to dim(x);
x(i) = ranuni(0);
end;
output;
end;
run;
proc export data=a
outfile="c:\temp\tempfile.csv"
dbms=CSV
replace;
run;
そして、ここに関連するログがあります:
NOTE: The file 'c:\temp\tempfile.csv' is:
Filename=c:\temp\tempfile.csv,
RECFM=V,LRECL=32767,File Size (bytes)=0,
Last Modified=23Jan2013:15:27:13,
Create Time=23Jan2013:15:27:13
NOTE: 6 records were written to the file 'c:\temp\tempfile.csv'.
The minimum record length was 9636.
The maximum record length was 23087.
NOTE: There were 5 observations read from the data set WORK.A.
NOTE: DATA statement used (Total process time):
real time 0.26 seconds
cpu time 0.09 seconds
5 records created in c:\temp\tempfile.csv from A.
NOTE: "c:\temp\tempfile.csv" file was successfully created.
NOTE: PROCEDURE EXPORT used (Total process time):
real time 2.04 seconds
cpu time 0.26 seconds
最初の行には列ヘッダーが含まれていることに注意してください。
更新: SAS の最新バージョン (9.3 TS1M1 以降) を使用している場合は、最大 1,048,576 行 x 16,384 列の Office 2010 Excel スプレッドシートを作成できます。その場合は、 を使用しますDBMS=XLSX
。
XLSXまたはCSVで問題がなければ、ボブの答えは良いです。.xls Excel ファイル (255 列の制限) を作成したい場合、または 9.3TS1M1 を持っていない場合は、それを行うのはかなり簡単です。正確な方法は、各ファイルに入る列をどのように指定するかによって異なります。
各 255 列を個別のファイルに分割し、2 つのファイルを中間点で分割したいとします (変数のセットごとに、35000 レコードがファイル A に、35001 レコードがファイル B に)。次のようにします。
options mprint symbolgen;
data test;
array xs x1-x1700;
do id = 1 to 70000;
do _t = 1 to dim(xs);
xs[_t]=ranuni(7);
end;
output;
end;
run;
%macro export_file(varstart=,varend=,varnumstart=0,varnumend=0,recstart=1,recend=0,keeplist=,dset=, libname=WORK, outfile=,sheet="sheet1");
%if &varnumstart ne 0 %then %do;
proc sql noprint;
select name into :varstart from dictionary.columns
where libname=upcase("&libname.") and memname=upcase("&dset.") and varnum=&varnumstart.;
select name into :varend from dictionary.columns
where libname=upcase("&libname.") and memname=upcase("&dset.") and varnum=&varnumend.;
quit;
%end;
%if &varstart=%str() or &varend=%str() %then %do;
%put "ERROR: MISSING PARAMETERS. PLEASE CHECK YOUR MACRO CALL AND RERUN. MUST HAVE VARSTART AND VAREND OR VARNUMSTART AND VARNUMEND.";
%abort;
%end;
data _for_Export/view=_for_export;
set &libname..&dset;
keep &varstart.--&varend.
%if &keeplist ne %str() %then %do;
&keeplist
%end;
;
if _N_ ge &recstart.;
%if &recend ne 0 %then %do;
if _N_ le &recend.;
%end;
run;
proc export data=_for_export file=&outfile. dbms=excel replace;
sheet=&sheet.;
run;
proc datasets nolist noprint lib=work;
delete _for_export/memtype=view;
quit;
%mend export_file;
%export_file(varnumstart=1,varnumend=250, keeplist=id,recstart=1,recend=35000,dset=test,outfile="c:\temp\test.xls",sheet="sheet1");
%export_file(varnumstart=1,varnumend=250, keeplist=id,recstart=35001,recend=99999,dset=test,outfile="c:\temp\test.xls",sheet="sheet2");
%export_file(varnumstart=251,varnumend=500, keeplist=id,recstart=1,recend=35000,dset=test,outfile="c:\temp\test.xls",sheet="sheet3");
%export_file(varnumstart=251,varnumend=500, keeplist=id,recstart=35001,recend=99999,dset=test,outfile="c:\temp\test.xls",sheet="sheet4");
sheet4をエクスポートしようとすると失敗します.xlsファイルの合計サイズに制限があるかどうかはわかりませんが、これを簡単に変更して別のファイルを作成できます. 個別のファイルごとに連続しない特定の変数名を指定する必要がある場合、これは機能しませんが、dictionary.columns からプルする SQL コードをかなり簡単に変更して、代わりに作成した変数名を保持するテーブルからプルすることができます。各ファイルに必要です。