我需要将具有 100,000 行 * 100,000 列的 sas 数据集打印到 excel 文件中。Proc 导出或 ODS html 语句中断,因此无法打印相同的语句。
文件语句中的数据可以打印出来。但是,由于它们的逻辑记录长度限制,打印不正确,基本上我的一行被分解为 3 行。是否有出路,或者这是 SAS 在数据处理方面的限制?
我需要将具有 100,000 行 * 100,000 列的 sas 数据集打印到 excel 文件中。Proc 导出或 ODS html 语句中断,因此无法打印相同的语句。
文件语句中的数据可以打印出来。但是,由于它们的逻辑记录长度限制,打印不正确,基本上我的一行被分解为 3 行。是否有出路,或者这是 SAS 在数据处理方面的限制?
与其说是 SAS 的限制,不如说是 Excel 的限制,它可以处理多达 16384 列和多达 100 万行,具体取决于版本。Excel 不适合处理这种规模的数据集。使用适当的数据库。
你当然不能在任何系统中把它变成 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 显然足够长,我也会遇到缓冲区溢出。