投稿

6月, 2015の投稿を表示しています

動かして覚える infileステートメント filevar オプション ~複数ファイルをヘッダを飛ばして一括で読み込む~ - SAS

イメージ
複数のファイルを dataステップ1回で読み込もうとしたとき、それぞれのファイルに読み込ませたくないヘッダーがあると、firstobs オプションを使ってもヘッダを飛ばせず上手く読み込まれません。しかし、filevar オプションを使ってみたところ、上手く全てのヘッダを飛ばして読み込ませることができたので、その方法と filevar オプションについてご紹介します。 (※ filevar オプションではなく、eov オプションを用いた解決方法が、データステップ100万回 SAS新手一生 の記事「 filenameで複数ファイルを一括指定して、読み込む場合に各ファイル1行目がラベル行だと、難しいことになるがeovをうまく使えば解決できる話 」にて、ご紹介されていますので、こちらもご参考ください。) (※ filevar オプションによる解決方法は、コーディングミスによる無限ループの危険性があるから、ヘッダを飛ばすだけなら、eov オプションの方が良いかもしれません。) サンプルに用意した入力ファイルは、以下のようなファイルです。 格納場所  : /folders/myfolders/filevar/ 文字コード : Shift-JIS 改行コード : CRLF 区切り文字 : , (カンマ) なにも考えずに読み込むと、以下みたいに、ヘッダが残ってしまいます。 filename IN "/folders/myfolders/filevar/test?.txt" ; data TEST ; infile IN dlm=',' dsd missover lrecl=1048576 encoding="sjis" termstr=CRLF ; input V1 : $CHAR10. V2 : 8. V3 : $CHAR60. ; run ; filename のファイル名に指定している ? は1文字にマッチするワイルドカードです。 encoding オプション 入力ファイルの文字コードを指定する。 termstr オプション 入力ファイルの改行コードを指定する。 inf

whereステートメントで処理時間を遅くする書き方 ~年月でオブザベーションを絞り込む~ - SAS

年月でオブザベーションを絞り込む方法について質問を受けたとき、処理効率の話になったので、その話をまとめてみました。 オブザベーションを条件式で絞り込む方法には、whereステートメントとサブセット化 ifステートメントがあります。基本的には、whereを使ったほうが処理速度が早いのですが、書き方によっては if 並に遅くなってしまいます。 下記に、2015年6月のデータのみに絞り込むための 5つのサンプルパターンを作成しました。 年月で絞り込むテストコード options lognumberformat ; /* ログのオブザベーション数にカンマを付ける */ /* テストデータ */ data TEST ; format DT yymmdds10. ; do I=1 to 100000000 ; /* 1億 */ /* 2015/01/01 から 365日間のいずれかのSAS日付を項目 DT に格納します */ DT = mdy(01, 01, 2015) + int(365 * ranuni(1)) ; output ; end ; run ; /* 2015年6月に絞り込むためのマクロ変数を定義します */ %let TARGET_MONTH = %sysfunc(mdy(6, 1, 2015)) ; %let TARGET_YYYY = %sysfunc(year(&TARGET_MONTH.)) ; %let TARGET_MM = %sysfunc(month(&TARGET_MONTH.)) ; %put &=TARGET_MONTH. ; %put &=TARGET_YYYY. ; %put &=TARGET_MM. ; /* intnx関数から来月の月初を算出して、絞り込む */ data TEST1 ; set TEST ; where &TARGET_MONTH. <= DT < intnx('MONTH', &TARGET_MONTH., 1, 'BEGINNING') ; run ; /* intnx関数から今月の月末を算出して、絞り込む */ data

プログラムの処理時間を計測したい - SAS

イメージ
SASプログラムの処理時間は、1つのdataステップやプロシージャ単位でログに表示されるのだけど、複数ステップの合計処理時間を取得したい、プログラム全体の処理時間を知りたいとかあるかと思います。処理時間を計測するためには、現在の日時を取得する datetime関数を用いることで計測することができます。 処理時間を計測するテストコード /* 処理時間を計測したい処理直前の日時をマクロ変数 START_TIME に格納 */ data _null_ ; call symputx('START_TIME', datetime()) ; run ; /* 処理を計測したいサンプルコード */ data TEST1 ; do I=1 to 10000000 ; R = ranuni(1) ; output ; end ; run ; /* 処理直後の日時 - 処理直前の日時 = 処理時間 */ data _null_ ; PROCESS_TIME = datetime() - &START_TIME. ; putlog PROCESS_TIME= ; run ; 処理時間を計測した実行ログ 59 data _null_ ; 60 call symputx('START_TIME', datetime()) ; 61 run ; NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.01 秒 62 63 data TEST1 ; 64 do I=1 to 10000000 ; 65 R = ranuni(1) ; 66 output ; 67 end ; 68 run ; NOTE: データセットWORK.TEST1は10,000,000オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間):

SAS雲丹 (SAS University Edition) におけるオートコンプリート機能(コード補完機能)の出し方 Ctrl+Space

イメージ
※ 下記の結果は、SAS雲丹 - SAS studio 3.3 にて実行しています。 SAS雲丹(SAS University Edition) のエディタには、オートコンプリート機能があります。オートコンプリート機能とは、ユーザが次に入力するキーワードを予測して表示させる機能で、なかなか便利です。 例えば、「da」と入力すると、もしかして data?みたいにキーワード一覧を表示してくれます。右側に表示されているのは構文ヘルプで、選択したステートメントなどの情報が記載されているものです。 このオートコンプリート機能ですが、入力途中にしか表示されないかと思っていたのですが、ショートカットキーで表示することができました。ショートカットキーは、ctrl+Spaceです。 例えば、単に「p」と1文字だけ入力したときは、オートコンプリートは出てきません。カーソルを移動させず、この状態で ctrl+Spaceを押すと下記のように表示されます。 このオートコンプリート機能ですが、なにも入力されていないところで実行すると、マクロステートメントまたはグローバルステートメントの一覧が表示されます。どちらが表示されるかは、カーソル位置によって異なるようですが、、カーソル位置の直後にマクロがあるかできまってるぽい?です。 コメント欄にて、ctrl+Spaceを押すと、色, 出力形式, 入力形式, マクロ関数, SAS関数, 統計量キーワード, スタイル要素, スタイル属性を表示することができます。これらは、ctrl+Spaceを押すことで切り替えることができ、ctrl+shift+Spaceで逆順に切り替えることができます。 (なんでコメントでこれらのオートコンプリートが出てくるのだろう...) また、コメントだけでなく、int関数, ranuni関数、mdy関数などの関数内の丸括弧の中でも、ctrl+Spaceを押すと上記が表示されます。(なんで関数内で出るのだろうか...)

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

イメージ
SAS環境の違いにより、SASのデータセットの文字コードが混在することがまれによくあると思います。 データセットの文字コードがSAS環境に合っていないと、文字化けが起きてしまいますし、パフォーマンスが低下してしまうので、きちんと環境に合わせる必要があります。 文字コード変換をしなくてはいけないデータセットってどれだろうと一括で調べるための準備として、データセットの文字コードを取得してマクロ変数に格納できるようになるまでが今回のお話です。 ちなみに、文字コードがSAS環境の文字コード(セッションエンコーディング)と合っていないと、下記のようなログメッセージが出て怒られます。 59 data TEST(encoding=sjis) ; 60 A = 1 ; 61 run ; INFO: データファイルWORK.TEST.DATAに他のホストにネイティブな形式が使用されているか、またはエンコーデ ィングがセッションエンコーディングと一致していません。クロス環境データアクセスが使用され るため、追加のCPUリソースが必要となり、パフォーマンスが低下します。 NOTE: データセットWORK.TESTは1オブザベーション、1変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.05 秒 CPU時間 0.00 秒 さて、データセットの文字コード取得は、proc contentsを用いることで取得できます。しかし、リスト出力のままでは、出力結果をSASプログラム上で扱うことが出来ません。 そこで登場しますのが、ods output です。 ods output により、リスト出力した結果をデータセットとして取得することができます。 data TEST1 ; A = 1 ; run ; ods output attributes=DATASET_ENCODING ; proc contents data=TEST1 ; run ; ods output close ; proc contents で指定したデータセットの文字コードが格納されている属性情報