我是一位相对较新的SAS用户,所以请耐心等待我!
我有63个文件夹,每个文件夹都包含一个唯一命名的xls文件,所有文件都包含相同顺序的相同变量。我需要将它们连接成一个文件。我会发布一些我尝试过的代码但是,相信我,这一切都非常糟糕,完全没用。下面是libname语句中的基本库结构:
`libname JC 'W:\JCs\JC Analyses 2016-2017\JC Data 2016-2017\2 - Received from JCs\&jcname.\2016_&jcname..xls`
(有63个唯一的& jcname值)
有什么想法吗?
提前致谢!!!
答案 0 :(得分:1)
这是一个常见的要求,但它需要相当不常见的多个SAS功能才能很好地执行。
我喜欢用两步解决方案解决这个问题:
虽然您可以在阅读时处理每个文件名,但调试和维护分隔这些步骤的代码要容易得多。
第1步:阅读文件名
我认为获取文件名列表的最佳方法是使用dread()
来阅读
将目录条目转换为数据集,如下所示:
filename myfiles 'c:\myfolder';
data filenames (keep=filename);
dir = dopen('myfiles');
do file = 1 to dnum(dir);
filename = dread(dir,file);
output;
end;
rc = dclose(dir);
run;
完成此步骤后,您可以验证是否已读取正确的文件名以打印数据集。您还可以修改代码以仅输出某些类型的文件。我将此作为练习留给读者。
第2步:使用文件
给定数据集中的名称列表,我更喜欢在数据步骤中使用call execute()
来处理每个文件。
data _null_;
set filenames;
call execute('%import('||filename||')');
run;
我还没有包含一个宏来读取Excel文件并连接数据集(部分原因是因为我没有合适的Excel文件列表来测试,但也因为它具有情境性问题)。下面的存根宏只是将文件名输出到日志,以验证它是否正在运行:
%macro import(filename);
/* This is a dummy macro. Here is where you would do something with the file */
%put &filename;
%mend;
备注:强>
可以说,在网络上的多个地方有许多如何做到这一点的例子,例如:
但是,他们中的大多数都依赖于使用pipe
来运行dir
或ls
命令,我认为这是错误的方法,因为它依赖于平台和在许多现代环境中,管道shell命令的能力将被禁用。
我的基础是Daniel Santos在communities.sas.com中的回答,但鉴于stackoverflow的优越功能,我更倾向于在这里看到一个好的答案。