2017-06-21 147 views
-1

我是一个相对较新的SAS用户,请耐心等待!(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

您的问题不符合SO指导原则,请显示您到目前为止所尝试的内容。 https://stackoverflow.com/help/how-to-ask – Reeza

+0

你有代码工作(或企图)导入一个Excel文件?如果是这样,那就证明。你有没有试过一个宏,它会把&jcname作为参数并读入一个excel文件中?如果是这样,那就证明。一旦你有了这些,就不必再让这个宏循环遍历63个名字的列表。显示你的代码将帮助其他人帮助你。 – Quentin

+0

尽管我同意上述评论,尽管这是一个广泛的问题,但我认为答案仍然有用。在这个网站上似乎没有任何好的答案,并且类似问题的搜索结果出现了一些粗略的答案。这不是SAS中的日常问题,即使对于开始SAS程序员来说,基本方法也不熟悉。它仍然让我停下来思考。 – david25272

回答

1

这是一个常见的需求,但它需要多个SAS功能相当罕见的知​​识来执行。

我想用两个步骤解决处理这个问题:

  1. 获取文件名列表
  2. 方法在回路

每个文件名虽然您可以处理每个文件名作为你阅读它,调试和维护分离这些步骤的代码会容易得多。

第1步:阅读文件名

我想获得的文件名列表的最佳方法是使用dread()阅读 目录条目到DataSet如下:

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的优越功能,我宁愿在这里看到一个好的答案。

+0

来自宏文档的示例1&2应该足够了。 https://communities.sas.com/t5/SAS-Communities-Library/SAS-9-4-Macro-Language-Reference-Has-a-New-Appendix/ta-p/291716 – Reeza

相关问题