範例 (END CASE 指令)

重組資料檔以使每一個資料項目成為單一觀察值

INPUT PROGRAM.
DATA LIST /#X1 TO #X3 (3(F1,1X)).
 
VECTOR V=#X1 TO #X3.
 
LOOP #I=1 TO 3.
- COMPUTE X=V(#I).
- END CASE.
END LOOP.
END INPUT PROGRAM.
 
BEGIN DATA
2 1 1
3 5 1
END DATA.
FORMAT X(F1.0).
PRINT / X.
EXECUTE.
  • 輸入程式會含括從輸入檔建置觀察值的指令。 因為 END CASE 是用來從單一輸入記錄建立多個觀察值,所以需要輸入程式。
  • DATA LIST 定義三個變數。 在格式規格中,數字 3 是重複因數,在括弧中重複該格式三次,每個變數一次。 指定的格式為 F1 ,且 1X 規格會跳過一個直欄。
  • VECTOR 會建立向量 V ,並以原始標為暫時刪除變數作為其三個元素。 LOOP 指令上的索引表示式會將變數 #I 增量三次,以控制每個輸入觀察值的反覆運算次數,並提供向量 V的索引。
  • COMPUTE 會將 X 設為等於每一個標為暫時刪除變數。 END CASE 告訴程式建置案例。 因此,第一個迴圈 (適用於第一個觀察值) 會將 X 設為等於向量 V的第一個元素。 由於 V (1) 參照 #X1,且 #X1 是 2 , X 的值是 2。 然後,在控制項回到指令 END LOOP之前,會格式化並列印變數 X 。 迴圈會繼續,因為檢索未完成。 因此,程式會將 X 設為 #X2,即 1 ,會建置第二個觀察值,並將它傳遞給 FORMATPRINT 指令。 在將 X 設為等於 1 的第三次反覆運算之後,程式會格式化並列印大小寫,並終止迴圈。 由於未發現檔案結尾, END INPUT PROGRAM 會將控制權傳遞給輸入程式 DATA LIST中的第一個指令,以讀取下一個輸入案例。 不過,在第二個迴圈之後,程式會遇到 END DATA 並完成作用中資料集的建置。
  • 六個新觀察值如下。
圖 1. 從單一觀察值讀取多個觀察值的結果

2
1
1
3
5
1

重組資料檔以建立每一個書籍訂單的個別觀察值

INPUT PROGRAM.
DATA LIST  /ORDER 1-4 #X1 TO #X22 (1X,11(F3.0,F2.0,1X)).

LEAVE ORDER.
VECTOR BOOKS=#X1 TO #X22.

LOOP #I=1 TO 21 BY 2 IF NOT SYSMIS(BOOKS(#I)).
- COMPUTE ISBN=BOOKS(#I).
- COMPUTE QUANTITY=BOOKS(#I+1).
- END CASE.
END LOOP.
END INPUT PROGRAM.
BEGIN DATA
1045 182 2 155 1 134 1 153 5
1046 155 3 153 5 163 1
1047 161 5 182 2 163 4 186 6
1048 186 2
1049 155 2 163 2 153 2 074 1 161 1
END DATA.

SORT CASES ISBN.
DO IF $CASENUM EQ 1.
- PRINT EJECT /'Order ISBN Quantity'.
- PRINT SPACE.
END IF.
 
FORMATS ISBN (F3)/ QUANTITY (F2).
PRINT /' ' ORDER ' ' ISBN '  ' QUANTITY.
 
EXECUTE.
  • 從檔案中擷取資料,該檔案的記錄會儲存發票號碼的值,以及一系列訂購的書籍代碼和數量。 例如,發票 1045 適用於四種不同的標題,總計九本書: 書籍 182 的兩份, 155 和 134 的一份,以及書籍 153 的五份。 此作業是將每一個個別帳面訂單分成一筆記錄,並在每一個新案例上保留訂單號碼。
  • 輸入程式會含括從輸入檔建置觀察值的指令。 它們是必要的,因為 END CASE 指令是用來從單一輸入記錄建立多個觀察值。
  • DATA LIST 指定 ORDER 作為永久變數,並定義 22 個標為暫時刪除變數以保留書籍編號和數量 (這是 72 欄中的數字和數量上限)。 在格式規格中,第一個元素會在變數 ORDER值之後跳過一個空格。 數字 11 會重複遵循它 11 次的格式: 每一個書籍編號和數量配對各一次。 指定的格式為 F3.0 (若為書號) 及 F2.0 (若為數量)。 1X 規格會在每一個數量值之後跳過一個直欄。
  • LEAVE 會在要產生的新觀察值之間保留變數 ORDER 的值。
  • VECTOR 會設定向量 BOOKS ,並以 22 個標為暫時刪除變數作為其元素。 第一個元素是 #X1,第二個元素是 #X2,依此類推。
  • 如果向量 Books 的元素不是系統遺漏的,則 LOOP 會起始迴圈結構以在向量 Books中移動,並提取書籍編號及數量。 編製索引子句會在 1 時起始編製索引變數 #I ,最多可增加 2 個。
  • 第一個 COMPUTE 指令會將變數 ISBN 設定為等於向量 BOOKS 中由 #I編製索引的元素,即現行書籍號碼。 第二個 COMPUTE 會將變數 QUANTITY 設為等於向量 Books中的下一個元素, #I + 1 , 這是與 書籍 (#I)中書籍號碼相關聯的數量。
  • END CASE 會指示程式寫出具有下列三個變數之現行值的觀察值: ORDERISBNQUANTITY
  • END LOOP 會終止迴圈結構並將控制項傳回 LOOP 指令,其中 #I 會增加 2 ,迴圈會繼續直到讀取整個輸入觀察值或直到 #I 超出最大值 21 為止。
  • SORT CASES 會依書籍編號來排序新觀察值。
  • DO IF 結構含括 PRINT EJECT 指令和 PRINT SPACE 指令,以設定輸出的標題。
  • FORMATS 會為新變數 ISBNQUANTITY建立字典格式。 PRINT 會顯示新的觀察值。
  • EXECUTE 會執行指令。 輸出如下所示。
圖 2. 顯示新觀察值的 PRINT 輸出

Order ISBN Quantity
 1049   74    1
 1045  134    1
 1045  153    5
 1046  153    5
 1049  153    2
 1045  155    1
 1046  155    3
 1049  155    2
 1047  161    5
 1049  161    1
 1046  163    1
 1047  163    4
 1049  163    2
 1045  182    2
 1047  182    2
 1047  186    6
 1048  186    2

建立近似對數常態分佈的變數

SET FORMAT=F8.0.

INPUT PROGRAM.
LOOP I=1 TO 1000.
+ COMPUTE SCORE=EXP(NORMAL(1)).
+ END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.

FREQUENCIES VARIABLES=SCORE /FORMAT=NOTABLE /HISTOGRAM
 /PERCENTILES=1 10 20 30 40 50 60 70 80 90 99
 /STATISTICS=ALL.
  • 輸入程式會使用單一變數 評分來建立 1,000 個觀察值。 評分 的近似對數常態分佈值。

重組資料檔以為每個個體建立個別觀察值

INPUT PROGRAM. 
DATA LIST  /#RECS 1 HEAD1 HEAD2 3-4(A).    /*Read header info
LEAVE  HEAD1 HEAD2.

LOOP  #I=1 TO #RECS.
DATA LIST  /INDIV 1-2(1).                  /*Read individual info
PRINT  /#RECS HEAD1 HEAD2 INDIV.
END CASE.                                  /*Create combined case
END LOOP.
END INPUT PROGRAM.
BEGIN DATA
1 AC
91
2 CC
35
43
0 XX
1 BA
34
3 BB
42
96
37
END DATA.
LIST.
  • 資料位於具有標頭記錄的檔案中,這些記錄指出記錄類型及隨後的個別記錄數。 每一個標頭記錄後面的記錄數會有所不同。 例如,第一個標頭記錄 (AC) 的第一個直欄中的 1 表示僅遵循一個個別記錄 (91)。 第二個標頭記錄 (CC) 的第一個直欄中的 2 表示接下來有兩個個別記錄 (35 和 43)。 下一筆標頭記錄沒有個別記錄,以直欄 1 中的 0 表示,依此類推。
  • 第一個 DATA LIST 會將每個標頭記錄的預期個別記錄數讀入臨時變數 #RECS#RECS 會用作索引變數中的終止值,以使用第二個 DATA LIST來讀取正確的個別記錄數。
  • 變數 HEAD1HEAD2 分別包含標頭記錄中第 3 欄和第 4 欄的資訊。 LEAVE 指令會保留 HEAD1HEAD2 ,以便將此資訊傳播至個別記錄。
  • 變數 INDIV 是來自個別記錄的資訊。 INDIIV 會結合 #RECSHEAD1HEAD2 來建立新的案例。 請注意,在下列 PRINT 指令的輸出中,不會針對標頭記錄建立任何大小寫,而 #RECS則為 0。
  • END CASE 會將每一個觀察值從輸入程式傳遞至 LIST 指令。 如果沒有 END CASEPRINT 指令仍會顯示觀察值,因為它位於迴圈內。 不過,每個標頭記錄只有一個 (最後一個) 觀察值會超出輸入程式。 LIST 的結果將會非常不同。
圖 3. 列印輸出

1 A C 9.1
2 C C 3.5
2 C C 4.3
1 B A 3.4
3 B B 4.2
3 B B 9.6
3 B B 3.7
圖 4. 指定 END CASE 時的 LIST 輸出

HEAD1 HEAD2 INDIV

A     C      9.1
C     C      3.5
C     C      4.3
B     A      3.4
B     B      4.2
B     B      9.6
B     B      3.7
圖 5. 未指定 END CASE 時的 LIST 輸出

HEAD1 HEAD2 INDIV

A     C      9.1
C     C      4.3
X     X       .
B     A      3.4
B     B      3.7