2015-07-10 60 views
-1

我需要分解這個SAS宏,它將一些變量的後綴添加到僞代碼中,但有些部分我不完全理解。將SAS宏分解成僞代碼

%macro add_suffix(lib,dsn, suffix); 
    options pageno=1 nodate; 
    OPTIONS OBS= 1; 
    DATA GRIDWORK.TMP; 
    SET &lib..&dsn.; 
    RUN; 

    proc sql noprint; 
    select nvar into :num_vars 
     from dictionary.tables 
      where libname="GRIDWORK" and 
       memname="TMP"; 
    select distinct(name) into :var1- 
     :var%TRIM(%LEFT(&num_vars)) 
    from dictionary.columns 
     where libname="GRIDWORK" and 
      memname="TMP"; 
    quit; 

    run; 

    OPTIONS OBS= MAX; 
    proc datasets library=&LIB; 
     modify &DSN; 
     rename 
      %do i=1 %to &num_vars; 
       &&var&i=&&var&i..&suffix 
      %end; 
     ; 
    quit; 

    run; 

    proc datasets library=&LIB; 
     modify &DSN; 
     rename pers_gen_key&suffix = pers_gen_key; 
    quit; 

    run; 

    proc sql; 
     drop table gridwork.tmp; 
    quit; 
%mend add_suffix; 

1)在這部分代碼:

DATA GRIDWORK.TMP; 
SET &lib..&dsn.; 
RUN; 

你怎麼能已設置等於兩個值數據集呢?它是否將GRIDWORK.TMP設置爲& lib和& dsn的並置?這裏的多個時期究竟意味着什麼?

2)我明白,這部分存儲在數組變量:

proc sql noprint; 
    select nvar into :num_vars 
     from dictionary.tables 
      where libname="GRIDWORK" and 
       memname="TMP"; 
    select distinct(name) into :var1- 
     :var%TRIM(%LEFT(&num_vars)) 
    from dictionary.columns 
     where libname="GRIDWORK" and 
      memname="TMP"; 
quit; 

究竟是如何做到dictionary.tables和dictionary.columns工作,以及他們如何從海誓山盟在這方面有什麼不同? Here是文檔,我通讀了它,但仍然無法理解代碼的這一部分究竟發生了什麼。

3)在臨近宏的結尾,我們有:

OPTIONS OBS= MAX; 
proc datasets library=&LIB; 
    modify &DSN; 
    rename 
     %do i=1 %to &num_vars; 
      &&var&i=&&var&i..&suffix 
     %end; 
    ; 
quit; 
run; 

Here是用於PROC數據集程序的文檔。它說它命名該過程處理的庫。這是否意味着& dsn是&庫庫的一部分?我想我不確定圖書館如何在SAS中工作。它們是內置的還是用戶定義的?爲什麼他們需要,我們不能僅僅修改自己的DSN嗎?

+0

這是三個問題之一 - 請一次限制一個問題。這在很大程度上表明您對SAS沒有基本的瞭解;通過花幾天時間閱讀SAS文檔和/或參加基本的SAS課程,可以獲得所有上述問題的答案。 – Joe

+0

也可以看看打開'option mprint;'和更多的調試信息,你可以打開'選項mlogic symbolgen macrogen;'。這可能會幫助你瞭解正在發生的事情。 –

+0

@Joe,這裏有什麼合適的協議,如果我沒有回答這個問題,現在就刪除我的答案? – Reeza

回答

0
  1. SAS有兩個級別引用,庫名稱和數據集名稱。第一個宏變量指向庫,第二個宏指向數據集名稱。一個句點告訴宏處理器宏變量的結束位置,第二個句點用於從數據集名稱中分離出libname。

  2. 它不存儲在數組中,其創建的宏變量。 Dictionary表是關於你的表的元數據。我會建議實際看着他們。表格之間的區別在於TABLES具有關於數據集的信息,而COLUMNS具有關於每個表格中的變量的信息。

  3. 庫僅僅是存儲SAS數據集的目錄/文件夾。這允許SAS引用不同的目錄來保存文件,並允許用戶在其數據上實施組織系統。 & dsn是& lib文件夾中的一組數據集。

我強烈建議你看看%put聲明,並將其放置在代碼中的各個部分,看看到底是什麼代碼正在做什麼。