(sas)连接来自不同文件夹的多个文件

时间:2017-06-21 21:47:28

标签: merge sas concatenation xls directory

我是一位相对较新的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值)

有什么想法吗?

提前致谢!!!

1 个答案:

答案 0 :(得分:1)

这是一个常见的要求,但它需要相当不常见的多个SAS功能才能很好地执行。

我喜欢用两步解决方案解决这个问题:

  1. 获取文件名列表
  2. 处理循环中的每个文件名
  3. 虽然您可以在阅读时处理每个文件名,但调试和维护分隔这些步骤的代码要容易得多。

    第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来运行dirls命令,我认为这是错误的方法,因为它依赖于平台和在许多现代环境中,管道shell命令的能力将被禁用。

    我的基础是Daniel Santos在communities.sas.com中的回答,但鉴于stackoverflow的优越功能,我更倾向于在这里看到一个好的答案。