0

我需要将具有 100,000 行 * 100,000 列的 sas 数据集打印到 excel 文件中。Proc 导出或 ODS html 语句中断,因此无法打印相同的语句。

文件语句中的数据可以打印出来。但是,由于它们的逻辑记录长度限制,打印不正确,基本上我的一行被分解为 3 行。是否有出路,或者这是 SAS 在数据处理方面的限制?

4

2 回答 2

6

与其说是 SAS 的限制,不如说是 Excel 的限制,它可以处理多达 16384 列和多达 100 万行,具体取决于版本。Excel 不适合处理这种规模的数据集。使用适当的数据库。

于 2013-06-25T09:20:49.987 回答
3

你当然不能在任何系统中把它变成 excel。

您应该能够将其转换为另一种格式,例如文本文件。例如:

data mydata;
array vars[100000];
do _n_=1 to 10;
 do _t = 1 to dim(vars);
  vars[_t]=_t;
 end;
 output;
end;
drop _t;
run;

data _null_;
file "c:\temp\myfile.csv" dlm=',' lrecl=2000000;
set mydata;
put _all_;
run;

*put all对此并不能正常工作,但由于我不知道您的变量名称或设置,我无法真正为您提供更好的解决方案;您很可能可以使用快捷方式来定义 put 语句。

最大 LRECL 值取决于您的操作系统,但我认为它们中的大多数可以处理一两百万。Win7当然可以。您也可以将 PROC EXPORT 用于 csv,但您必须从日志中获取(300k 行)代码并将 LRECL 修改为更大,因为它默认为 32767,我认为您无法修改它在过程中。

SAS/IML 也将允许另一种选择。我不确定你真的可以在任何合理的系统上做 100k*100k (如果它是数字 8 字节矩阵元素,你需要存储 800 亿字节......)

proc iml;
x=j(1e5,1e5,12345);

filename out ’c:\temp\myfile.csv’;
file out lrecl=800000;
do i=1 to nrow(x);
  do j=1 to ncol(x);
   put (x[i,j]) 5.0 +5 ',' @;
  end;
put;
end;
closefile out;
quit;

编辑: IML 中的 lrecl 语句似乎不太正常,否则我在这里做错了 - 但这可能是我的系统的错误。即使 lrecl 显然足够长,我也会遇到缓冲区溢出。

于 2013-06-25T13:53:10.707 回答