我尝试在没有找到解决方案的情况下搜索论坛找到答案: https://stackoverflow.com/search?page=3&tab=Relevance&q=listing%20over%20datasets%20sas
/* make all letters lower case */
data steg1;
set steg0b;
email = lowcase(email);
run;
/* stripping down email column */
data steg2;
set steg1;
email = strip(email);
run;
我想在某个库中的所有数据集上运行某个代码(长一个,我发布了它的一部分)(可能循环是正确的方法)。该库是一个包含所有工作表的excel文件(需要以不同的方式在datastep中进行转换)。所需的输出是与原点在同一目录中的另一个文件,其名称为" cleaning.xlsx"或类似的。
我分享一些代码:
%let filepath=
\\mynetworkpath\;
%let filname=
tobecleaned.xlsx;
%let file=
&filepath.\&filename;
libname epostimp xlsx "&file.";
这让我得到了一个名为epostimp的图书馆,在那里我找到了不同的图纸,我们称之为挪威,丹麦,瑞典。
我现在想要为三个数据集执行我的datastep。
此后我想将它们导出到我想称为clean.xlsx的同一个excel文件中(在clean.xlsx中我希望看到挪威,丹麦,瑞典的表 - 就像在原版中一样)。
问题将是:
很高兴听到一些如何制作它的建议。
答案 0 :(得分:0)
我相信这实际上是您要寻找的。请记住,EXCEL引擎将创建工作表和指定名称的范围,但这通常无关紧要。
本质上,将两个文件都视为库,一个人可以遍历输入文件(输入库)中的库成员,并在输出文件(输出库)中以相同的名称重新创建它们。
请记住,此代码不是很可靠,如果输出文件已经存在,则会生成错误。可以包括自动删除和创建新文件,但最好还是谨慎一点。另外,如果工作表名称包含空格或特殊字符,这可能会导致迭代出现问题。例如,拥有名为“ Sheet 1”的工作表将导致“ ii”分别遍历“ Sheet”和“ 1”。
%macro loop_over_sheets(in_file, out_file);
libname in_lib excel "&in_file.";
libname out_lib excel "&out_file.";
%local ii ds_name ds_names;
/* Get the dataset names. */
proc sql noprint;
select memname into :ds_names separated by ' '
from dictionary.members
where upcase(LIBNAME) = 'IN_LIB';
quit;
%do ii = 1 %to %sysfunc(countw(&ds_names.));
%let ds_name = %scan(&ds_names., &ii.);
data out_lib.&ds_name.;
set in_lib."&ds_name.$"n;
/* ... your code here ... */
run;
%end;
libname in_lib clear;
libname out_lib clear;
%mend loop_over_sheets;
%loop_over_sheets(&file., &filepath.cleaned.xlsx);
最后一行使用示例中给定的file和filepath宏变量。根据需要进行修改。