動かして覚える 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 秒

参考サイト

  1. SAS: MISSOVER, TRUNCOVER, STOPOVER, FLOWOVER and SCANOVER / Erik Haselhofer (英語)
  2. The SAS® INFILE and FILE Statements (英語 / PDFファイル)

コメント

  1. はじめまして。
    まさに、このあたりの挙動がマニュアルみてもよく分からなかったので、大変勉強になります!
    これからも新作記事楽しみにしております!

    返信削除
  2. はじめまして!
    マニュアルは読んでも動きが分からないものが多くて、いつも苦戦しています。
    今後ともよろしくお願いします!

    返信削除

コメントを投稿

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS