2013-08-02 110 views
2

OK,我會的問題開始: 我正在創建的每個這是在格式命名一週產品表:自動化表/對象名稱掃描和SAS搜索

products_20130701 
products_20130708 
. 
. 
. 

我想自動進行一些廣告系列分析,以便我不必每週手動更改代碼中的表名,以便在廣告系列的最長結束日期之後使用哪個產品表是第一個產品表。

%put &max_enddate.; 
/*20130603*/ 

在六月我的產品表是:

products_20130602 
*products_20130609* 
products_20130616 
products_20130623 
在這種情況下

我想用第二個表在列表中,忽略了超過12個月的價值產品表和只是選擇誰的日期是在我的max_enddate宏之後。

我一直在谷歌搜索整天,我難倒,所以任何意見將不勝感激。

謝謝!

+0

夏洛特 - 如果你滿意的答案,請把它標記爲正確的! –

回答

0

首先,獲得所有可能的表:

data PRODUCT_TABLES; 
    set SASHELP.VTABLE (keep=libname memname); 
    *get what you need, here i keep it simple; 
    where lowcase(substr(memname,1,9))='products_'; 
run; 

接下來,按日期排序,容易因您的數據集名的格式來完成。

proc sort data=PRODUCT_TABLES; 
    by memname; 
run; 

最後,你只需要把第一條記錄放在日期足夠大的地方。

data _NULL_; 
    set PRODUCT_TABLES; 
    *compare to your macro variable, note that i keep it as simple as possible and let SAS implicitly convert to numeric; 
    if substr(memname,10,18)>=symgetn("max_enddate") then do; 
     *set your match into a macro variable, i have put together the libname and memname here; 
     call symput("selectedTable",cats(libname,'.',memname)); 
     stop; *do not continue, otherwise you will output simply the latest dataset; 
    end; 
run; 

現在,你可以把宏觀變量時要使用相應的數據集,如:

data SOME_TABLE; 
    set &selectedTable.; 
    /*DO SOME STUFF*/ 
run; 
+0

感謝你們,我是SAS初學者,所以我不確定需要進入第一個數據集:數據PRODUCT_TABLES;設置SASHELP.VTABLE(keep = libname memname);其中lowcase(substr(memname,1,9))='products_';跑;我不知道在「設置」命令使用什麼,因爲我希望它搜索表全庫開始products_ * dateid * –

+0

好,因爲我已經在寫的例子,它會發現,啓動所有數據集與products_。您可以使用正則表達式來調整where子句,以找到具有以下結構的所有數據集:(1)以products_開頭,(2)後面緊跟8個數字。但我的直覺是,你對正則表達式也是新手,不是嗎? – mvherweg

+0

哎呀我的壞:/正如我所說的:初級 你知道如果我需要,我會怎麼寫這是一個做循環?所以可能是這樣的:do循環; i =&max_enddate + 1;如果存在(products_&i。),那麼*做某事*其他;再次循環; ? 你可以看到我不知道語法... –

2

一個SQL解決方案:

data product_20130603; 
run; 

data product_20130503; 
run; 

data product_20130703; 
run; 

%let campdate=20130601; 

proc sql; 
    select min(memname) into :datasetname from dictionary.tables 
    where libname='WORK' and upcase(scan(memname,1,'_'))='PRODUCT' and 
    input(scan(memname,2,'_'),YYMMDD8.) ge input("&campdate.",YYMMDD8.); 
quit; 

現在你有&數據集名稱是你可以在set語句中使用,所以

data my_analysis; set&datasetname; (無論你在做什麼); 跑;

將'WORK'修改爲適當的libname,如果還有其他限制,請添加它們。如果您有product_somethingnotadate,那麼您可能會收到有關無效日期的警告,但這並不重要。

工作方式 - dictionary.tables是您訪問的所有libname中的所有表的列表(與sashelp.vtable相同,但僅在PROC SQL中可用)。首先,選擇日期大於或等於廣告系列結束日期的所有行;那麼它需要從min(memname)。 Memname當然是一個字符串,但是除了數字之外,其他字符串都是相同的,所以仍然可以使用min並獲得預期的結果。

+0

+1我喜歡它,它沒有得到晦澀更簡潔。 – mvherweg

+0

這是非常簡潔的,我試圖成爲一個聰明的,並避免使用SQL通過使用循環掃描所有表名稱(或東西?),但這是不那麼複雜和不必要的。我只需等待,以瞭解更多關於循環的情況,並在需要時。再次感謝 :) –

1

這可能是不適合你的應用程序,但是我找到我,因爲他們絕對必須存在每個星期天的數據集,它是非常有用的,我在我的代碼開始評估數據集的存在。如果它們不存在,那麼它會向我們的IT人員發送一封電子郵件,告訴他們文件丟失並需要重新創建\恢復。

%LET DSN = PRODUCTS_%SYSFUNC(PUTN(%SYSFUNC(INTNX(WEEK.2,%SYSFUNC(INPUTN(&MAX_ENDDATE.,YYMMDD8.)),0,END)),YYMMDDN8.)); 

隨着其他建議上面,他們只會給你的存在的數據集的結果,因此,如果您應該使用一直是一個已被刪除,那麼它會抓住下一個也不管運行作業。