如何用SAS现有zip宏打包整文件夹及其他文件夹的指定数据集
实现多源SAS数据集合并打包的两种方案
针对你需要打包一个完整文件夹+另一个文件夹中指定数据集的需求,不用手动移动文件,这里提供两种可行方案:
方案一:扩展现有zip宏,支持多路径与指定数据集
直接修改原有宏,让它能处理多个输入路径,并对特定路径下的数据集进行筛选,无需额外中转即可完成打包。
修改后的宏代码
%macro zip_multi(paths=, zip_name=, ziplock=, include_ds=); /* 初始化ZIP文件输出通道 */ filename zipout "&ziplock./&zip_name..zip" zip mode=create; /* 拆分多个输入路径 */ %let path_count = %sysfunc(countw(&paths.)); %do idx = 1 %to &path_count.; %let current_path = %scan(&paths., &idx.); /* 为当前路径创建临时逻辑库(方便读取数据集信息) */ libname temp_lib "¤t_path."; %if &idx. = 2 %then %do; /* 处理第二个路径:仅打包指定数据集 */ proc sql noprint; select cats("¤t_path./", trim(memname), ".sas7bdat") into :target_files separated by ' ' from dictionary.tables where libname = 'TEMP_LIB' and upcase(memname) in (%upcase(&include_ds.)); quit; /* 将指定文件写入ZIP */ %if &sqlobs. > 0 %then %do; filename ds_files (&target_files.); data _null_; infile ds_files eof=finish; file zipout member=%scan(_infile_, -1, '\') recfm=n; input; put _infile_; finish: run; filename ds_files clear; %end; %end; %else %do; /* 处理其他路径:打包所有数据集 */ filename dir_files "¤t_path./sas7bdat"; data _null_; infile dir_files eof=finish; file zipout member=%scan(_infile_, -1, '\') recfm=n; input; put _infile_; finish: run; filename dir_files clear; %end; /* 清理临时逻辑库 */ libname temp_lib clear; %end; /* 关闭ZIP输出通道 */ filename zipout clear; %mend zip_multi;
使用示例
假设你要打包C:\full_data下所有数据集,加上C:\partial_data里的DS1、DS2、DS3,输出ZIP到C:\output目录:
%zip_multi(paths="C:\full_data" "C:\partial_data", zip_name=combined_dataset, ziplock="C:\output", include_ds=DS1 DS2 DS3);
方案二:临时目录中转(复用原有zip宏)
如果不想修改原有宏,可以通过临时目录把需要的文件集中,再调用原有宏打包,最后清理临时文件。
实现代码
/* 1. 创建临时目录(用SAS工作目录作为临时存储) */ %let temp_dir = %sysfunc(getoption(work))/zip_temp; x "md &temp_dir."; /* Windows环境,UNIX换成x "mkdir -p &temp_dir." */ /* 2. 复制完整文件夹的所有数据集到临时目录 */ libname full_lib "C:\full_data"; libname temp_lib "&temp_dir."; proc copy inlib=full_lib outlib=temp_lib; run; /* 3. 复制指定数据集到临时目录 */ libname partial_lib "C:\partial_data"; proc copy inlib=partial_lib outlib=temp_lib; select DS1 DS2 DS3; /* 指定要打包的数据集 */ run; /* 4. 调用原有zip宏打包临时目录 */ %zip(path=&temp_dir., zip_name=combined_dataset, ziplock=C:\output); /* 5. 清理临时目录与逻辑库 */ libname full_lib clear; libname partial_lib clear; libname temp_lib clear; x "rd /s /q &temp_dir."; /* Windows环境,UNIX换成x "rm -rf &temp_dir." */
注意事项
- 确保所有目标文件夹都已通过
libname关联为SAS逻辑库,或者根据实际路径调整代码中的文件读取方式。 - 如果你用的是UNIX/Linux环境,需要把代码中的Windows命令(
md、rd)换成对应的Shell命令。 - 方案一中的宏默认假设第二个路径是需要筛选数据集的,如果你需要更灵活的配置,可以新增参数标记哪个路径需要筛选。
内容的提问来源于stack exchange,提问作者B K
相关产品推荐
相关产品推荐

