2017-10-13 53 views
0

主題: SAS圖書館定義庫,其中一些文件夾的名字都將在每次更改(當來自不同用戶的這種SAS運行宏)

難度:路徑(文件名和位置)是每次運行後更改,但只有一些細節正在改變,但不是完整的路徑(如下例所示)。我們還突出顯示了這些字段的大小

我想只寫一個代碼,我可以覆蓋文件名和位置中發生的所有類型的更改,是否有可能?

%let path='C:\Data\variationstring\empcat**A**\person**34**_**1212**\persondata_empcatA_**34**';  
libname test "&path"; 
proc import datafile="&path\Accounts_**34**.xls" 
    out=mydata 
    sheet="thefile"; 
    getnames=no; 
run; 

當其他用戶運行該程序,然後上面的路徑將被改變:

%let path='C:\Data\variationstring\empcat**A**\person**49**_**1684**\persondata_empcatA_**49**';  
libname test "&path"; 
proc import datafile="&path\Accouns_**49**.xls" 
    out=mydata 
    sheet="thefile"; 
    getnames=no; 
run; 

誰能幫助我,這好嗎?

感謝

+0

請更具體的在您的問題,並提供更多的信息。這些數字('34','49','1212'等)是指什麼?這些應該根據用戶運行代碼動態解決? – user2877959

+0

粗體在代碼格式中不起作用,fyi ... – Joe

+0

您也可以在數據步驟中使用LIBNAME函數,以便更容易地操作字符串。 – Reeza

回答

1

試圖把它在這樣一個宏:

%macro import (macro_var1,macro_var2,macro_var3); 
%let path="C:\Data\variationstring\empcat**A**\person**&macro_var1.**_**&macro_var2.**\persondata_empcatA_**&macro_var3.**";  
libname test "&path"; 
proc import datafile="&path\Accouns_**49**.xls" 
    out=mydata 
    sheet="thefile"; 
    getnames=no; 
run; 
%mend; 
%import (34, 1212, 34); 
%imoprt (49, 1684, 49); 
etc. 

定義路徑時,不要忘了把它放在雙引號(「)insted的單(')

+0

您可能想要將'&macro_Var1.'添加到'proc import'文件名中。我猜想第三個宏參數是不需要的,它只是'&macro_var1'重複。 – Joe

+0

實際上,你確實需要第三個變量,但它是用於'empcat'('** A **')。 – Joe

1

除了格里戈裏的很好的建議,它看起來像你對我正在做的事情,將得到更好的服務利用數據驅動的編程方法。

如果你有,說,一個包含所有人員記錄的excel電子表格 - 例如,第一個數字是store,第二個數字是employeeID - 並且您希望按照employeeID運行一個報告,然後編寫如Grigory所建議的宏;但您可以從第一個數據集中調用報告。

所以在這裏:

proc import file="C:\Data\employeeID.xlsx" 
      out=employees dbms=xlsx 
      replace; 
run; 

%macro get_employee(store=, employeeID=, empCat=); 
%let path="C:\Data\variationstring\empcat&empcat.\person&store._&employeeID.\persondata_empcat&empcat._&store.";  
libname test "&path"; 
proc import datafile="&path\Accouns_&store..xls" 
    out=mydata 
    sheet="thefile"; 
    getnames=no; 
run; 
%mend get_employee; 

proc sql; *this generates macro calls, look at output to see what the macro variable contains; 
    select cats('%get_employee(employeeid=',employeeID,',store=',store,',empcat=',empcat,')') 
    into :get_emp_list separated by ' ' 
    from employees; 
quit; 

&get_emp_list.; *This actually runs all those macro calls; 

你可以閱讀我的文章,Writing Code With Your Data瞭解更多詳情,或在網上找到其他類似的論文。

相關問題