2013-08-02 108 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.)); 

随着其他建议上面,他们只会给你的存在的数据集的结果,因此,如果您应该使用一直是一个已被删除,那么它会抓住下一个也不管运行作业。