既存のデータセットにあるオブザベーションの置き換え、削除、追加を実行します。ただし、オブザベーションのコピーは作成しません。
該当要素: | DATAステップ |
カテゴリ: | ファイル操作 |
種類: | 実行 |
制限事項: | 変数の追加など、SASデータセットのディスクリプタ部分を変更することはできません。 |
注: | パスワードで保護されたデータセットを変更する場合、DATAステートメントではなくMODIFYステートメントの適切なデータセットオプション(ALTER=またはPW=)にパスワードを指定します。 |
MODIFYステートメントを使用して読み込まれた変数はPDVで保持されます。詳細については、XisError: No pubcode in link data found for lrconおよびRETAINステートメントを参照してください。 | |
注意: |
MODIFYステートメントを含むDATAステップの実行中にシステムが異常終了すると、SASデータセットが破損する可能性があります。
ネイティブSASデータファイルのオブザベーションに誤ったデータ値が含まれたり、データファイルが読み込めなくなる場合があります。ビューで参照するDBMSテーブルには影響はありません。
|
変更対象となるSASデータセット(マスタデータセット)を指定します。
制限事項 | このデータセットは、DATAステートメントにも指定する必要があります。 |
順次アクセスまたはマッチングアクセスの場合、マスタデータセットには、SASデータファイル、SAS/ACCESSビュー、SQLビュー、LIBNAMEステートメントのDBMSエンジンを指定できます。DATAステップビューとSQLプロシジャのパススルー機能を使用したビューは指定できません。 | |
POINT=オプションを指定したランダムアクセスの場合、マスタデータセットにはSASデータファイルか、SASデータファイルを参照するSQLビューを指定する必要があります。 | |
KEY=オプションを指定したダイレクトアクセスの場合、マスタデータセットにはSASデータファイルか、LIBNAMEステートメントのDBMSエンジンを指定できます。SASファイルを指定する場合、インデックス付きである必要があり、KEY=オプションにインデックス名を指定する必要があります。 | |
DBMSの場合、KEY=オプションにキーワードDBKEYを設定し、インデックスとして使用する列名をDBKEY=データセットオプションに指定する必要があります。指定した列名は、DBMSに渡すWHERE式の生成に使用されます。 | |
ヒント | データセット名を使用するかわりに、オペレーティングシステムでサポートされている構文を使用してファイルの物理パス名を指定することができます。物理パス名は一重引用符または二重引用符で囲む必要があります。 |
SASデータセット名の後ろに、1つまたは複数のSASデータセットオプションを丸かっこで囲んで指定します。
注 | データセットオプションは、処理対象のオブザベーションをDATAステップに読み込むときに実行するアクションを指定します。データセットオプションのリストについては、次を参照してください。 SASデータセットオプション: リファレンス |
ヒント | データセットリストに適用するデータセットオプションは、データセットリストに存在するすべてのデータセットに適用されます。 |
マッチングアクセスで使用する値を含むSASデータセットを指定します。この値はマスタデータセットの更新に使用されます。
制限事項 | このデータセットは、DATAステップにBYステートメントが含まれている場合にのみ指定してください。 |
ヒント | データセット名を使用するかわりに、オペレーティングシステムでサポートされている構文を使用してファイルの物理パス名を指定することができます。物理パス名は一重引用符または二重引用符で囲む必要があります。 |
オブザベーションの識別に使用する、1つまたは複数の変数名を指定します。
データセットから読み込んだオブザベーション数を含む変数を作成および名前を付与
作成する一時変数の名前を指定します。この変数の値には終端指示子が格納されます。
制限事項 | この引数は、POINT=オプションを指定したMODIFYステートメントには使用しないでください。POINT=オプションは、MODIFYステートメントでランダムアクセスを使用することを示しています。ランダムアクセスの場合、END=オプションに指定した変数の値が1に設定されることはありません。 |
注 | この変数の初期値は0です。この変数の値が1に設定されるのは、MODIFYステートメントによって、変更するデータセットの最後のオブザベーションが読み込まれた場合(順次アクセスの場合)、またはトランザクションデータセットの最後のオブザベーションが読み込まれた場合(マッチングアクセスの場合)です。また、この変数の値は、MODIFYステートメントでKEY=オプションに指定した値に一致する値が見つからなかった場合にも1に設定されます(ランダムアクセスの場合)。 |
この変数はどのデータセットにも追加されません。 |
変更するSASデータセットの単一インデックスまたは複合インデックスを指定します。KEY=オプションを指定すると、他のソースに含まれる同一の変数名のインデックス値に基づいて、SASデータセットからオブザベーションを取得します。
デフォルト | KEY=オプションの値が見つからない場合、自動変数_ERROR_の値は1に設定されます。また、自動変数_IORC_は、SYSRC自動呼び出しマクロのニーモニック_DSENOMに対応する値を受け入れます。自動変数_IORC_とSYSRC自動呼び出しマクロを参照してください。 |
制限事項 | KEY=オプションの処理は、SAS/ACCESS Engineによって異なります。詳細については、SAS/ACCESSのドキュメントを参照してください。 |
ヒント | KEYRESET=オプションを使って、読み込むデータセットのインデックスの先頭からKEY=オプションに指定された値の検索を開始するかどうかをコントロールします。 |
インデックス値のソースの例として、SETステートメントに指定した別のSASデータセットやINPUTステートメントで読み込まれた外部ファイルなどがあります。 | |
マスタデータセットにインデックス値の重複がある場合、そのインデックス値を持つ最初のオブザベーションしか更新されません。これを回避するには、DO ループ処理を使用して、KEY=オプションに指定したデータセットのSETステートメントがマスタデータセットの重複インデックス値に対して繰り返し実行されるようにします。 | |
トランザクションデータセットの重複インデックス値が連続している場合、UNIQUEオプションを指定して、マスタデータセットでのインデックス値の検索が、常にインデックスの先頭から実行されるようにします。さらに、合計ステートメントを使用して、トランザクションデータセットの重複インデックス値のオブザベーションがマスタデータセットのオブザベーションに追加されるようにする必要もあります。UNIQUEオプションを指定しない場合、重複インデックス値のうち、最初に検出されたトランザクションデータセットのオブザベーションのみを使用してマスタデータセットを更新します。 | |
トランザクションデータセットの重複インデックスが連続していない場合、検索は毎回インデックスの先頭から開始されるので、重複インデックス値がマスタデータセットにそれぞれ適用されます。合計ステートメントを作成すると、トランザクションデータセットの重複インデックス値のオブザベーションがマスタに追加されます。 | |
参照項目 | KEYRESET=variable |
UNIQUE | |
例 | インデックスにより検索されるオブザベーションの変更 |
作成する一時変数の名前を指定します。この一時変数の値は、入力データセットに含まれるオブザベーションの合計数になります。特定のSASビューとTAPEやXMLエンジンのような順次エンジンに対しては、SASがオブザベーション数を検知することができません。この場合、NOBS=オプションに指定した変数の値には、動作環境で使用できる最大の正の整数値が設定されます。
注 | コンパイル時に、データセットのディスクリプタ情報を読み込んでから、NOBS=オプションの変数の値を自動的に割り当てます。そのため、MODIFYステートメントの実行前にもNOBS=オプションの変数を参照できます。この変数はDATAステップで使用できますが、新しいデータセットには追加されません。 |
ヒント | NOBS=オプションとPOINT=オプションは互いに独立しています。 |
例 | オブザベーション番号により検索されるオブザベーションの変更 |
オブザベーション番号をもとにランダム(ダイレクト)アクセスを使用してSASデータセットを読み込みます。variableには、読み込むオブザベーションの番号を格納する変数の名前を指定します。POINT=オプションに指定した変数はDATAステップのどの位置にでも指定できますが、SASデータセットには追加されません。
制限事項 | POINT=オプションは次のものとは併用できません。
|
圧縮データセットでPOINT=オプションを使用できるのは、POINTOBS=データセットオプションをYES(デフォルト値)に設定してこのデータセットを作成した場合のみです。 | |
SASバージョン7以降を使用している場合のみ、圧縮ファイルにランダムアクセス方式を使用できます。 | |
要件 | POINT=オプションを使用する場合、次のプログラミング要素のどちらかまたは両方を使用してください。
|
POINT=オプションでは指定したオブザベーションのみを読み込むため、順次アクセスでファイルを読み込む場合とは違い、ファイル終端条件を読み取ることができません。ファイル終端条件を検出するとDATAステップを自動的に終了させるため、POINT=オプションの使用時にDATAステップを終了させる別の方法を準備しないと、DATAステップで無限ループが発生する場合があります。 | |
ヒント | POINT=オプションに指定した変数の値がオブザベーションの番号と一致しない場合、自動変数_ERROR_の値が1に設定されます。 |
例 | オブザベーション番号により検索されるオブザベーションの変更 |
変更するデータファイルの先頭からKEY=オプションに指定した値の検索を開始します。
制限事項 | UNIQUEオプションは、KEY=オプションを指定する場合にのみ使用できます。 |
ヒント | UNIQUEオプションは、トランザクションデータセットの中にKEY=オプションに指定したインデックス値の重複が連続して存在する場合に使用します。このオプションを使用すると、トランザクションデータセットにある重複した値ごとに、マスタデータセットでの一致する値の検索をインデックスファイルの先頭から開始します。この場合、合計ステートメントを使用する必要があります。合計ステートメントを使用しないと、重複した値による上書きが発生するため、最後のトランザクションの値のみがマスタオブザベーションに反映されます。 |
参照項目 | KEYRESET=variable |
例 | 重複するインデックス値の処理 |
トランザクションデータセットにある変数の欠損値を使用して、マスタデータセットにある既存の変数の値を置き換えるかどうかを指定します。
トランザクションデータセットにある変数の欠損値を使用して、マスタデータセットにある変数の値を置き換えないように指示します。
欠損値があるかどうかのチェックを実行しません。トランザクションデータセットにある変数の欠損値を使用して、マスタデータセットにある変数の値を置き換えられるようにします。
デフォルト | MISSINGCHECK |
要件 | オブザベーションの一致を検出する基準を指示するBYステートメントに、UPDATEMODEオプションを指定する必要があります。 |
ヒント | ただし、特殊欠損値は例外です。この場合、MISSINGCHECKが有効な場合でも、マスタデータセットの値は特殊欠損値で置き換えられます。 |
data master; modify master trans; by key; if _iorc_=0 then replace; else output; run;
data master; modify master; x=1; replace; replace; run;
data master; modify master; output; run;
A
からZ
までの特殊欠損値の1つを定義すると、マスタデータセットに含まれる数値変数はその値に更新されます。
libname invty 'SAS-library';
data invty.stock(index=(partno)); input PARTNO $ DESC $ INSTOCK @17 RECDATE date7. @25 PRICE; format recdate date7.; datalines; K89R seal 34 27jul95 245.00 M4J7 sander 98 20jun95 45.88 LK43 filter 121 19may96 10.99 MN21 brace 43 10aug96 27.87 BC85 clamp 80 16aug96 9.55 NCF3 valve 198 20mar96 24.50 KJ66 cutter 6 18jun96 19.77 UYN7 rod 211 09sep96 11.55 JD03 switch 383 09jan97 13.99 BV1E timer 26 03jan97 34.50 ;
data invty.stock; modify invty.stock; recdate=today(); run; proc print data=invty.stock noobs; title 'INVTY.STOCK'; run;
data addinv; input PARTNO $ NWSTOCK; datalines; K89R 55 M4J7 21 LK43 43 MN21 73 BC85 57 NCF3 90 KJ66 2 UYN7 108 JD03 55 BV1E 27 ;
libname invty 'SAS-library';
data invty.stock; modify invty.stock addinv; by partno; RECDATE=today(); INSTOCK=instock+nwstock; if _iorc_=0 then replace; run;
proc print data=invty.stock noobs; title 'INVTY.STOCK'; run;
data newp; input TOOL_OBS NEWP; datalines; 1 251.00 2 49.33 3 12.32 4 30.00 5 15.00 6 25.75 7 22.00 8 14.00 9 14.32 10 35.00 ;
libname invty 'SAS-library';
data invty.stock; set newp; modify invty.stock point=tool_obs nobs=max_obs; if _error_=1 then do; put 'ERROR occurred for TOOL_OBS=' tool_obs / 'during DATA step iteration' _n_ / 'TOOL_OBS value might be out of range.'; _error_=0; stop; end; PRICE=newp; RECDATE=today(); run;
proc print data=invty.stock noobs; title 'INVTY.STOCK'; run;
libname invty 'SAS-library';
data invty.stock; set addinv; modify invty.stock key=partno; INSTOCK=instock+nwstock; RECDATE=today(); if _iorc_=0 then replace; run;
proc print data=invty.stock noobs; title 'INVTY.STOCK'; run;
M4J7
が2つ含まれています。
data newinv; input PARTNO $ NWSTOCK; datalines; K89R 55 M4J7 21 M4J7 26 LK43 43 MN21 73 BC85 57 NCF3 90 KJ66 2 UYN7 108 JD03 55 BV1E 27 ;
M4J7
に一致するオブザベーションをデータセットINVTY.STOCKで探そうとしたときにエラーが発生し、DATAステップが異常終了します。libname invty 'SAS-library';
/* This DATA step terminates with an error! */ data invty.stock; set newinv; modify invty.stock key=partno; INSTOCK=instock+nwstock; RECDATE=today(); run;
ERROR:No matching observation was found in MASTER data set.PARTNO=M4J7 NWSTOCK=26 DESC=sander INSTOCK=166 RECDATE=08DEC10 PRICE=45.88 _ERROR_=1 _IORC_=1230015 _N_=3 NOTE:The SAS System stopped processing this step because of errors.NOTE:There were 3 observations read from the data set WORK.DEPT010.NOTE:The data set INVTY.STOCK has been updated.There were 2 observations rewritten, 0 observations added and 0 observations deleted.
M4J7
に対して、マスタデータセットに含まれるM4J7
が検出されます。出力されるM4J7
>の更新結果では、データセットNEWINVにある変数NWSTOCKの2つのM4J7
の値が、データセットINVTY.STOCKの変数INSTOCKの値M4J7
に追加されます。次に、合計ステートメントで値を合計します。合計ステートメントを指定しない場合、M4J7
の最後のインスタンスの値だけがデータセットINVTY.STOCKに反映されます。
data invty.stock; set newinv; modify invty.stock key=partno / unique; INSTOCK=instock+nwstock; RECDATE=today(); if _iorc_=0 then replace; run; proc print data=invty.stock noobs; title 'Results of Using the UNIQUE Option'; run;
data newship; input PARTNO $ DESC $ NWSTOCK @17 SHPDATE date7. @25 NWPRICE; datalines; K89R seal 14 14nov96 245.00 M4J7 sander 24 23aug96 47.98 LK43 filter 11 29jan97 14.99 MN21 brace 9 09jan97 27.87 BC85 clamp 12 09dec96 10.00 ME34 cutter 8 14nov96 14.50 ;
libname invty 'SAS-library';
data invty.stock; set newship; modify invty.stock key=partno; select (_iorc_); when (%sysrc(_sok)) do; INSTOCK=instock+nwstock; RECDATE=shpdate; PRICE=nwprice; replace; end; when (%sysrc(_dsenom)) do; INSTOCK=nwstock; RECDATE=shpdate; PRICE=nwprice; output; _error_=0; end; otherwise do; put 'An unexpected I/O error has occurred.'/ 'Check your data and your program'; _error_=0; stop; end; end; run;
proc print data=invty.stock noobs; title 'INVTY.STOCK Data Set'; run;
libname invty 'SAS-library';
data invty.stock invty.stock95 invty.stock97; modify invty.stock; if recdate>'01jan97'd then do; output invty.stock97; remove invty.stock; end; else if recdate<'01jan96'd then do; output invty.stock95; remove invty.stock; end; else do; price=price*1.1; replace invty.stock; end; run;
proc print data=invty.stock noobs; title 'New Prices for Stock Received in 1996'; run;