範例 (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 ,會建置第二個觀察值,並將它傳遞給FORMAT和PRINT指令。 在將 X 設為等於 1 的第三次反覆運算之後,程式會格式化並列印大小寫,並終止迴圈。 由於未發現檔案結尾,END INPUT PROGRAM會將控制權傳遞給輸入程式DATA LIST中的第一個指令,以讀取下一個輸入案例。 不過,在第二個迴圈之後,程式會遇到END DATA並完成作用中資料集的建置。- 六個新觀察值如下。
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會指示程式寫出具有下列三個變數之現行值的觀察值: ORDER、 ISBN及 QUANTITY。END LOOP會終止迴圈結構並將控制項傳回LOOP指令,其中 #I 會增加 2 ,迴圈會繼續直到讀取整個輸入觀察值或直到 #I 超出最大值 21 為止。SORT CASES會依書籍編號來排序新觀察值。DO IF結構含括PRINT EJECT指令和PRINT SPACE指令,以設定輸出的標題。FORMATS會為新變數 ISBN 和 QUANTITY建立字典格式。PRINT會顯示新的觀察值。EXECUTE會執行指令。 輸出如下所示。
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來讀取正確的個別記錄數。 - 變數 HEAD1 和 HEAD2 分別包含標頭記錄中第 3 欄和第 4 欄的資訊。
LEAVE指令會保留 HEAD1 及 HEAD2 ,以便將此資訊傳播至個別記錄。 - 變數 INDIV 是來自個別記錄的資訊。 INDIIV 會結合 #RECS、 HEAD1及 HEAD2 來建立新的案例。 請注意,在下列
PRINT指令的輸出中,不會針對標頭記錄建立任何大小寫,而 #RECS則為 0。 END CASE會將每一個觀察值從輸入程式傳遞至LIST指令。 如果沒有END CASE,PRINT指令仍會顯示觀察值,因為它位於迴圈內。 不過,每個標頭記錄只有一個 (最後一個) 觀察值會超出輸入程式。LIST的結果將會非常不同。
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
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
HEAD1 HEAD2 INDIV
A C 9.1
C C 4.3
X X .
B A 3.4
B B 3.7