1

我有一个数据库,其中有近 20k 列……这是 SAS 中转置过程的输出。

是否可以将 SAStranspose 的输出拆分为多个 csv 文件?就像我可以将 3000 列(保持 #rows 相同)推入 5 个 CSV 文件吗?.. 我如何使用 SAS 宏来做到这一点?

基本上,有一个变量,每个客户有 20k 个值。我需要创建一个文件,该变量应该在列中。我的原始数据如下所示:

CustID 变量值 1 4 0 1 3 23 1 1 22 1 2 18 2 4 0 2 3 23 2 1 22 2 2 18

所以转置后变成:CustID Var1 Var2 Var 3 Var4 1 22 18 23 0
2 22 18 23 0

但问题是上面的“变量”有 20K 值,所以当转置时它变成 Var1 到 Var20000 .. 不适合 excel ..

还有其他方法可以处理这个问题吗?

我认为 Excel 的容量为 16K 列,所以我想以这种方式处理它。请让我知道如何处理这种情况

4

2 回答 2

2

我同意这是一个坏主意,但这是另一种可能的解决方案;

data big;
   cust_id = 1;
   retain var1-var20000 0;
run;

data temp/view=temp;
  set big(keep=cust_id var1-var10000);
run;

proc export data=temp
   outfile='c:\temp\file1.csv'
   dbms=csv
   replace;
run;

data temp/view=temp;
  set big(keep=cust_id var10001-var20000);
run;

proc export data=temp
   outfile='c:\temp\file2.csv'
   dbms=csv
   replace;
run;

要控制写入的变量,只需根据需要更改视图定义。您最初询问创建五个 CSV,这会创建两个。

您必须使用视图,因为PROC EXPORT不尊重 KEEP 或 DROP 数据集选项。我不认为使用宏来做这样的事情是一个好主意,除非你非常确定你知道你在做什么并且你需要在不同的场景下多次运行它。

于 2013-10-04T16:36:50.473 回答
1

我将从“哇,这是个坏主意”开始。

如果你必须这样做,你可以很容易地编写你的 keep 语句甚至输出代码。

proc contents data=sashelp.class out=names(keep=varnum name) noprint;
run;
proc sql noprint;
select name into :keeplist separated by ' ' from names where varnum le 2;
quit;
data forexport/view=forexport;
set sashelp.class;
keep &keeplist;
run;
proc export data=forexport outfile="c:\temp\whatever.csv" dbms=csv replace;
run;

不幸的是,您需要该视图,因为至少在 9.4 中使用直接 keeplist 导出有一个奇怪的错误,它会删除换行符。

然后,您可以将 proc sql 中的位宏化到导出并使用不同的 le/ge 组合运行它。确保在每个文件中都包含匹配键。

于 2013-10-04T15:33:15.650 回答