2

因此,我试图根据特定的变量分组分解一个大型数据集(70,000 个 obs 和 1,790 个变量)。Excel 或 CSV 是导出到的理想格式,但对可变数字有限制(260 或其他)。任何想法如何在 SAS(或 R / SQL 否则)中做到这一点?

我知道宏有效,我以前用过。错误消息读取已达到变量限制。

4

2 回答 2

5

创建 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 或更高版本),您可以创建一个 Office 2010 Excel 电子表格,其中最多有 1,048,576 行 x 16,384 列。在这种情况下,您将使用DBMS=XLSX.

于 2013-01-23T23:32:19.057 回答
1

如果您对 XLSX 或 CSV 没问题,鲍勃的回答很好。如果您确实想制作一个 .xls excel 文件(限制为 255 列),或者没有 9.3TS1M1,这样做相当容易。具体如何取决于您要如何指定进入每个文件的列。

假设您只想将每 255 列放入一个单独的文件中,两个文件在中点拆分(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 代码,而不是从您创建的包含变量名称的表中提取您想要在每个文件中。

于 2013-01-24T15:51:23.583 回答