2017-02-15 25 views
1

是否有方法可以确定sas脚本中使用的所有列的列表? 我希望能够编写一个可以通过SAS代码文件的sas代码,并确定所有使用的列(在选择,条件处理/连接等中)。用于确定sas脚本中所有列的SAS代码

有没有人做过类似的事情。需要关于如何去做的建议。

谢谢!

回答

0

获取元数据的方法是处理内容

proc contents data=File_in_question 
    out= Data_out(keep=name) noprint; 
run; 

那里有很多更多的信息。要访问它,请删除(keep = name)限制。有关proc内容的更多信息,请参阅:http://libguides.library.kent.edu/SAS/ViewContents

1

要完美地完成此操作,您需要解析SAS源文件并从所产生的“抽象语法树”(AST)中提取所需信息,查找所有处理列。你的代码需要'知道'每个语句,函数和PROC可用。您还需要解析并执行代码中的任何宏语句 - 否则您不会知道宏代码可能生成哪些其他与列相关的语句。因为宏代码可能依赖于早期PROC或数据步骤中生成的数据,所以执行宏代码也需要执行底层的SAS代码,所以要获得正确的结果,基本上需要重新创建整个SAS系统。

有一些工具,如ANTLR(http://www.antlr.org/),旨在以某种语言(通常是Java)生成代码,以解析/解释/编译其他语言的代码。还有用于SAS ANLTR语法的讨论在这里:

https://groups.google.com/forum/#!topic/comp.soft-sys.sas/omyZ2sZR0pk

但我要说的是,在一般情况下解决这个问题几乎是不可能的,当然,如果你想这样做,只是从一组源文件,即而没有真正运行程序。

但是,对于某些明确定义的子集,您将能够做到这一点......您的问题似乎是专门讨论SQL,而不是一般的SAS。如果您不需要处理宏代码,并且仅限于任何PROC SQL步骤,那么您甚至可以使用预先存在的SQL解析器(这里列出了几个:http://www.antlr3.org/grammar/list.html),或者只是写SAS代码来查看对于SQL语句和子句的有限子集 - SELECT,ON,WHERE等。

祝你好运!

+0

感谢您的回应克里斯。我必须遍历SAS代码库,所以猜测这会很困难!我会通过您在回复中附加的链接查看是否有任何帮助。谢谢! – Rhea