情况:我有一个包含4个名为"SheetA", "SheetB", "SheetC", "SheetD"
的电子表格的工作簿.xls。
对于导入一个电子表格,我执行以下操作。
proc import
out = outputtableA
datafile = "C:\User\Desktop\excel.xls"
dbms = xls replace;
sheet = 'SheetA';
namerow = 3;
startrow = 5;
run;
所有电子表格都有相同数量的变量和格式。我想使用数据步骤将所有四个outputtableX组合在一起:
data combinedata;
set outputtableA outputtableB outputtableC outputtableD;
run;
我是SAS的新手,我在想array
和do-loop
是否可以提供帮助。
答案 0 :(得分:2)
我不会使用do循环(因为它们几乎总是过于复杂)。相反,我会让它成为数据驱动的。如果可以,我也会使用里斯的解决方案;但是如果由于namerow / datarow选项必须使用PROC IMPORT,则可以使用。
首先,创建libname。
libname mylib excel "c:\blah\excelfile.xls";
如果您更喜欢xls选项,我们实际上并没有使用它,但这可以让我们得到这些表。
proc sql;
select cats('%xlsimport(sheet=',substr(memname,1,length(memname)-1),')')
into :importlist separated by ' '
from dictionary.tables
where libname='MYLIB' and substr(memname,length(memname))='$';
quit;
libname mylib clear;
现在我们已经获得了一个宏调用列表,每张一个。 (工作表是一个数据集,但最后有一个' $')
现在我们需要一个宏。你已经写好了这件事。让我们在这里替换一些东西。
%macro xlsimport(sheet=);
proc import
out = out&sheet.
datafile = "C:\User\Desktop\excel.xls"
dbms = xls replace;
sheet = "&sheet.";
namerow = 3;
startrow = 5;
run;
%mend xlsimport;
现在我们称之为。
&importlist.
我作为一个练习留给家中的观众将所有这些包装在另一个宏中,该宏能够在给定文件名作为宏参数的情况下运行它;一旦你这样做了,你就拥有了一个完整的宏,只需很少甚至无法导入整个excel libname。
答案 1 :(得分:1)
如果你是一个xls文件并使用32位版本的SAS,那么这样就可以了:
libname inxls excel 'C:\User\Desktop\excel.xls';
proc datasets library=excel;
copy out=work;
run; quit;
libname inxls;
然后,您可以执行上述步骤将文件附加到一起。我不确定Proc Import with excel是否识别选项名称行和开始行,因此您可能需要以某种方式修改代码以适应这种情况,可能使用firstobs然后手动重命名变量。
答案 2 :(得分:0)
假设变量名称相同,您的工作将会起作用。如果他们不使用重命名语句使它们完全相同。
data combinedata;
set outputtableA(rename=(old_name1=new_name1 old_name2=new_name2 ... ))
outputtableB(...)
...
;
run;
显然,填写省略号。