SAS代码用于确定sas脚本中的所有列

时间:2017-02-15 03:56:53

标签: sas

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

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

谢谢!

2 个答案:

答案 0 :(得分: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等。

祝你好运!

答案 1 :(得分:0)

获取元数据的方法是 Proc内容

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

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