【问题标题】:Handling a lot of columns in Excel using SAS使用 SAS 处理 Excel 中的大量列
【发布时间】:2013-10-04 15:25:10
【问题描述】:

我有一个数据库,其中有近 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

所以转置后就变成了: 客户 ID Var1 Var2 Var 3 Var4 1 22 18 23 0
2 22 18 23 0

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

还有其他方法可以解决这个问题吗?

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

【问题讨论】:

  • 你到底在用现在有数千列的 excel 文件做什么?也许如果您对我们的最终目标有所了解,我们或许可以提出一个更可行的解决方案。
  • 谁是收到excel工作簿的可怜人,他们用它们做的第一件事是什么?我愿意打赌它要么什么都没有,要么以某种方式扭转你在这里问的问题:)

标签: excel sas multiple-columns transpose


【解决方案1】:

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

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 数据集选项。我不认为使用宏来做这样的事情是一个好主意,除非你非常确定你知道你在做什么并且你需要在不同的场景下多次运行它。

【讨论】:

  • 没有考虑到 var 默认以转置命名的事实 - 这实际上与我的解决方案相同,但考虑到自动名称更简单,这很好。
【解决方案2】:

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

如果你必须这样做,你可以很容易地编写你的 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 组合运行它。确保在每个文件中都包含匹配键。

【讨论】:

  • 谢谢乔!所以,在我的情况下,如果转置输出后有 10k 列......并且如果我在每个导出中需要 2k 列......我不明白关于 :keeplist ......如果我需要 5 个 varnum 条件......让比如 le2k、ge 2001 和 le 4k 等等……我每次都需要编写这些步骤吗?..我怎样才能把它放在宏中?..为什么 &keeplist 显示为宏声明..我是有点初学者,所以一些帮助可能会很棒!
  • 您要么需要编写 5 个 SQL 语句和 5 个 keeplist 变体(:keeplist 创建一个宏变量 &keeplist,所以你需要 :keeplist1 :keeplist2 等),要么将所有内容放入一个宏中并提供 start/end或迭代作为宏的参数。
猜你喜欢
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多