動かして覚える file ステートメント dropover , stopover オプション

data ステップの file ステートメントには、出力ファイル1行あたりの最大バイト数を指定する lrecl= オプションがついています。デフォルトでは、この lrecl= オプションを超えた値を出力しようとすると、次の行に超えた分の値が書き込まれます。

data TEST ;
  length A $10. ;
  A = "1" ;          output ;
  A = "1234567890" ; output ;
  A = "ABCDEFG" ;    output ;
run ;

filename OUT "/folders/myfolders/test.txt" ;

data _null_ ;
  set TEST ;
  file OUT lrecl=9 ;
  put A ;
run ;


dropover オプション

lrecl= の値を超えたとき、該当の行を削除したい場合は、fileステートメントに dropover オプションを付けます。

 68         data _null_ ;
 69           set TEST ;
 70           file OUT lrecl=9 dropover ;
 71           put A ;
 72         run ;
 
 NOTE: 出力ファイルOUT :
       ファイル名=/folders/myfolders/test.txt,
       所有者名=root,グループ名=vboxsf,
       アクセス権限=-rwxrwx---,
       更新日時=2015年07月22日 21時01分14秒
 
 NOTE: 3レコードを出力ファイルOUTに書き込みました。
       最小レコード長は0です。
       最大レコード長は7です。
 NOTE: DROPOVERオプションを指定しているため、出力の一部を無視しました。
 NOTE: データセットWORK.TESTから3オブザベーションを読み込みました。 
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.03 秒
       CPU時間            0.02 秒

該当の行は、スキップされるわけではなく、空行となって出力されます。



stopover オプション

lrecl= の値を超えたとき、処理を中止したい場合は、fileステートメントに stopover オプションを付けます。

 68         data _null_ ;
 69           set TEST ;
 70           file OUT lrecl=9 stopover ;
 71           put A ;
 72         run ;
 
 NOTE: 出力ファイルOUT :
       ファイル名=/folders/myfolders/test.txt,
       所有者名=root,グループ名=vboxsf,
       アクセス権限=-rwxrwx---,
       更新日時=2015年07月22日 21時10分25秒
 
 ERROR: PUTステートメントがレコード長を超えました。 
        FILE /folders/myfolders/test.txtオプションSTOPOVERを指定しました。
 A=1234567890 _ERROR_=1 _N_=2
 NOTE: 1レコードを出力ファイルOUTに書き込みました。
       最小レコード長は1です。
       最大レコード長は1です。
 NOTE: エラーが発生したため、このステップの処理を中止しました。
 NOTE: データセットWORK.TESTから2オブザベーションを読み込みました。 
 NOTE: DATAステートメント処理(合計処理時間):
       処理時間           0.01 秒
       CPU時間            0.02 秒

処理の中止なので、中止の直前までは内容がファイルに出力されます。



コメント

このブログの人気の投稿

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

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

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