動かして覚える infileステートメント flowover, missover, truncover, stopover, scanover オプション - SAS
infile ステートメントで、missover オブションはよく使っているのですが、どうやら、「~over」と名付けられたオプションが他にもあるようなので、調べてみました。オンラインヘルプの文章を読んでもよく分からなかったので、試しに実行してみました。
1. flowover, missover, truncover
flowoverはデフォルト値で、何も指定しなかった時と同じ動作をします。
missover と truncover は、ほぼ同じ動作をし、最後の列が欠損値のとき、欠損値として値を格納します。input ステートメントにて指定した長さよりも短いレコードが存在するとき、違いがあります。missover は、欠損値を格納しますが、truncover は入力値に応じた値を格納します。
テストコード - flowover, missover, truncover
options nocenter nodate nonumber ; proc printto file="/folders/myfolders/test3.lst" new ; run ; title "デフォルト / flowover" ; data TEST ; infile "/folders/myfolders/test3.txt" flowover ; input ID 3. ; run ; proc print ; run ; title "missover" ; data TEST ; infile "/folders/myfolders/test3.txt" missover ; input ID 3. ; run ; proc print ; run ; title "truncover" ; data TEST ; infile "/folders/myfolders/test3.txt" truncover ; input ID 3. ; run ; proc print ; run ; title "missover コロン付き" ; data TEST ; infile "/folders/myfolders/test3.txt" missover ; input ID : 3. ; run ; proc print ; run ;
テストデータ - flowover, missover, truncover
1 22 333 4444 55555 12 1 1 12
実行結果 - flowover, missover, truncover
デフォルト / flowover OBS ID 1 22 2 333 3 444 4 555 5 12 6 1 7 12 missover OBS ID 1 . 2 . 3 333 4 444 5 555 6 . 7 12 8 1 9 . 10 . truncover OBS ID 1 1 2 22 3 333 4 444 5 555 6 . 7 12 8 1 9 1 10 12 missover コロン付き OBS ID 1 1 2 22 3 333 4 4444 5 55555 6 . 7 12 8 1 9 1 10 12
missover では、欠損値の箇所が、truncoverだと、値が格納されているのがわかります。
2. stopover
stopoverは、inputに指定した変数が足りなかったら、処理を中断するオプション。
テストコード - stopover
title "stopover" ; data TEST ; infile cards stopover ; input A B ; cards ; 1234 AAA 2222 BBB 3333 4444 DDD run ;
実行ログ - stopover
NOTE: Bに対して、無効なデータが行74カラム6-8にあります。 RULE: ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0 74 1234 AAA A=1234 B=. _ERROR_=1 _N_=1 NOTE: Bに対して、無効なデータが行75カラム6-8にあります。 75 2222 BBB A=2222 B=. _ERROR_=1 _N_=2 ERROR: INPUTステートメントがレコード長を超えました。 INFILE CARDSオプションSTOPOVERを指定しました。 RULE: ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0 76 3333 A=3333 B=. _ERROR_=1 _N_=3 NOTE: エラーが発生したため、このステップの処理を中止しました。 WARNING: データセットWORK.TESTは未完成です。このステップは、2オブザベーション、 2変数で停止しました。 WARNING: このステップを中止したため、データセットWORK.TESTを置き換えていません。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.04 秒 CPU時間 0.03 秒
3. scanover
INPUT ステートメントに記載した @'character-string' カラムポインタコントロールに指定した文字列を検出するまで、入力データを読み込むようにします。missover, truncover, stopoverとも併用できます。
テストコード - scanover
options nocenter nodate nonumber ; proc printto file="/folders/myfolders/test3.lst" new ; run ; title "scanover" ; data TEST ; infile cards scanover ; input @"name:" A : $32. B : 8. ; cards ; hello name:SATO 123 goodbye name:HAYASHI 222 name:EMILY 333 goodnight TEST name:ANN 444 run ; proc print ; run ;
実行結果 - scanover
scanover OBS A B 1 SATO 123 2 HAYASHI 222 3 EMILY 333 4 ANN 444
実行ログ - scanover
NOTE: INPUT @'CHARACTER_STRING'が行の終端に達したので、次の行を読み込みます。 NOTE: データセットWORK.TESTは4オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.02 秒 CPU時間 0.03 秒
はじめまして。
返信削除まさに、このあたりの挙動がマニュアルみてもよく分からなかったので、大変勉強になります!
これからも新作記事楽しみにしております!
はじめまして!
返信削除マニュアルは読んでも動きが分からないものが多くて、いつも苦戦しています。
今後ともよろしくお願いします!