2017-06-21 151 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

相關問題