投稿

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

proc sql feedback - select句 * を展開したり、SASビューの定義をログに表示する - SAS

proc sql の feedback オプションについてのご紹介です。 テストコード 1 - proc sql feedback options msglevel=i ; /* テストデータ */ data TEST ; STR = "TEST" ; do I=1 to 1E5 ; R = ranuni(1) ; G = mod(I, 10) ; output ; end ; run ; %let TABLE_NAME = TEST ; proc sql feedback ; create table TEST1 as select * from &TABLE_NAME. /* コメント */ ; quit ; NOTE: Statement transforms to: の後に、SELECT句の * が展開された形で、SELECT文がログに表示されます。マクロ変数も展開され、コメントは削除されます。 71 proc sql feedback ; 72 create table TEST1 as 73 select * 74 from &TABLE_NAME. /* コメント */ 75 ; NOTE: Statement transforms to: select TEST.STR, TEST.I, TEST.R, TEST.G from WORK.TEST; NOTE: テーブルWORK.TEST1(行数100000、列数4)が作成されました。 76 quit ; NOTE: PROCEDURE SQL処理(合計処理時間): 処理時間 0.03 秒 CPU時間 0.04 秒 テストコード 2 - proc sql feedback : SQLビューを表示できます。 /* テストデータ2 */ data IDX ; G = 1 ; NOTE = "

proc sql ; describe ステートメント - データセットの定義内容をログに出力する - SAS

イメージ
proc sql で使用する describe ステートメントは、データセットの定義内容をログに表示するステートメントです。proc contents のログに表示するバージョンみたいな感じです。 1. describe table テストコード - create table create table で作成したデータセットに対して、describe ステートメントを使ってみます。 options msglevel=i ; proc sql noprint ; create table TEST1 ( A decimal ,B char(30) ,C varchar(10) ,D numeric ,E float ) ; describe table TEST1 ; quit ; 59 proc sql noprint ; 60 create table TEST1 61 ( 62 A decimal 63 ,B char(30) 64 ,C varchar(10) 65 ,D numeric 66 ,E float 67 ) 68 ; NOTE: テーブルWORK.TEST1(行数0、列数5)が作成されました。 69 describe table TEST1 ; NOTE: SQLテーブルWORK.TEST1は次のように作成されました: create table WORK.TEST1( bufsize=65536 ) ( A num, B char(30), C char(10), D num, E num ); 70 quit ; NOTE: PROCEDURE SQL処理(合計処理時間): 処理時間 0.02 秒 CPU時間 0.03 秒 文字項目はすべて c

動かして覚えるマクロ変数の展開 - && など &が複数あるパターン - SAS

マクロ変数の値を用いるには、& を使用します。この & を複数使用することで、マクロ変数を展開して、展開した値のマクロ変数を展開し、さらにその値のマクロ変数を・・・というような使い方ができます。 テストコード 1 - & が 1~3個 %let HELLO = SAS ; %let SAS = WORLD ; %put HELLO = &HELLO. ; %put HELLO = &&HELLO. ; %put HELLO = &&&HELLO. ; 59 %let HELLO = SAS ; 60 %let SAS = WORLD ; 61 62 %put HELLO = &HELLO. ; HELLO = SAS 63 %put HELLO = &&HELLO. ; HELLO = SAS 64 %put HELLO = &&&HELLO. ; HELLO = WORLD テストコード 2 - & いっぱい %let NUM = 1 ; %let CLASS_1 = FIRST ; %let FIRST = LAST ; %put CLASS = &CLASS._&NUM ; /* WARNING */ %put CLASS = &CLASS_&NUM ; /* WARNING */ %put CLASS = &&CLASS_&NUM ; %put CLASS = &&&CLASS_&NUM ; %put CLASS = &&&&CLASS_&NUM ; %put CLASS = &&&&&CLASS_&NUM ; %put CLASS = &&&&&&CLASS_&NUM ; 67 %let NUM

UTF-8 環境で、Shift-JIS の固定長ファイルを読み込むのって大変という話 - SAS

イメージ
前回の記事、「 Shift-JIS の固定長ファイルを UTF-8 環境に読み込む (kcvt関数) - SAS 」の余談。 「 Shift-JIS の固定長ファイルを UTF-8 環境に読み込む (kcvt関数) - SAS 」 にて、kcvt 関数を用いて、ファイルを読み込んでみました。 テスト用に用いたファイルでは、文字コード変換が必要な項目は1項目だけだったので、まだ良かったのですが、もし変換しなければならない項目が10項目、20項目、、、とあると、その項目の数だけ、length ステートメントと kcvt 関数を書かなければなりません。 これはとても面倒くさいです。 filename ステートメント、または infile ステートメントにて使用できる encoding= オプションを用いれば読め...ません。 このオプションは、CSV ファイルや TSV ファイルのように、区切り文字(セパレータ)があれば使えますが、固定長ファイルでは理想通りには使うことができません。 前回の記事のテストコードを流用して、固定長ファイルの読み込み時に encoding= を使うと、どうなるのか試しに使ってみます。 テストコード - encoding=sjis を追加 filename IN "/folders/myfolders/test.txt" ; data TEST ; infile IN recfm=F lrecl=28 encoding=sjis ; input @001 CUSTOMER_ID 5. @006 NAME $20. @026 AGE 2. ; run ; 実行ログ 56 filename IN "/folders/myfolders/test.txt" ; 57 58 data TEST ; 59 infile IN recfm=F lrecl=28 encoding=sjis ; 60 input @001 CUSTOMER_ID 5. 61

Shift-JIS の固定長ファイルを UTF-8 環境に読み込む (kcvt関数) - SAS

イメージ
読み込む固定長ファイル(Shift-JIS) 1~ 5バイト:顧客ID 6~25バイト:顧客名 26~27バイト:年齢 28バイト:改行コード(LF) 00001さとう たろう 27 00002こばやし さなえ 54 00003みたらい しょう 22 00004やぶき かける 24 00005はやし けんた 21 テストコード filename IN "/folders/myfolders/test.txt" ; data TEST ; infile IN recfm=F lrecl=28 ; input @001 CUSTOMER_ID 5. @006 NAME $20. @026 AGE 2. ; run ; Shift-JIS 環境に読み込むときは、上記のような感じでいいのですが、UTF-8 環境に読み込ませるときちんと読み込めません。 テストコード (修正) data TEST ; infile IN recfm=F lrecl=28 ; length NAME $30. ; input @001 CUSTOMER_ID 5. @006 NAME $20. @026 AGE 2. ; NAME = kcvt(NAME, 'sjis', 'utf8') ; run ; kcvt関数で、Shift-JIS の値を UTF-8 に変換します。第1引数に変換する項目、第2引数に変換前の文字コード、第3引数に変換後の文字コードを記載します。 これで文字コードを変換することができますが、input ステートメントの前に、length ステートメントで項目の長さを長くしておく必要があります。Shift-JIS は1文字1~2バイトで表現されますが、UTF-8は1文字1~4バイトで表現されます(IVSを入れれば、7, 8バイトもありますが)。なので、長さをそのままにしておくと文字切れが発生してしま

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

date コマンドは、日付を取得したり、整形して表示したり、◯日後や◯か月後、◯年前の日付を表示したりすることができます。 ◯か月前や◯か月後を使用する時が曲者で、月末に近い日に実行すると、思っていた動作をしてくれないことがあります。 $ date 2015年 9月 6日 日曜日 16:05:22 JST $ date -d "2015-08-31" 2015年 8月 31日 月曜日 00:00:00 JST $ date -d "2015-08-31 1 month" 2015年 10月 1日 木曜日 00:00:00 JST $ date -d "2015-01-31 1 month" 2015年 3月 3日 火曜日 00:00:00 JST 8月31日の1か月後が10月1日になったり、1月31日の1か月後が3月3日になったりします。月によって◯か月後の計算をきちんとしてくれるわけではないようです。 実施日の翌月末を取得するには、実施月の 1日に変換してから、2ヶ月後の1日前を指定することで取得できます。 $ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' \` 2 month"` 1 day ago" 2015年 10月 31日 土曜日 00:00:00 JST 指定した日付の翌月の月末を取得する場合は、以下のように書きます。 $ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' -d 2015/08/31\` 2 month"` 1 day ago" 2015年 8月 31日 月曜日 00:00:00 JST $ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' -d 2015/01/31\` 2 month"` 1 day ago" 2015年 2月 28日 土曜日 00:00:

数値を丸める関数 round, rounde, roundz の違い - SAS

イメージ
round 関数 四捨五入ぽい計算をしてくれる関数です。 第1引数がだいたい中間の値(近似値)の場合は、絶対値が大きい方に丸めます。 rounde 関数 偶数丸め(銀行丸め / JIS丸め)ぽい計算をしてくれる関数です。 第1引数がだいたい中間の値(近似値)の場合は、偶数の方に丸めます。 roundz 関数 偶数丸め(銀行丸め / JIS丸め)計算をしてくれる関数です。 round 関数や rounde 関数と違い、ちょうど中間の値で丸めてくれます。ただし、第2引数が1以下であったり、整数の逆数(例. 整数3 の逆数 1/3)でない場合だと、実際の計算と違う値になることがあります。 偶数丸めとはなにかというと、丸めをする桁数の1つ上の桁数が偶数の値に丸める処理のことです。 例えば、小数第1位を四捨五入する場合、0.5 は 1 になりますが、偶数丸めでは 0 になります。0.5 は、1 と 0 のちょうど中間で、偶数は 0 の方なので、偶数丸めでは 0 に丸められます。では、1.5 を小数第1位で四捨五入すると 2 になり、偶数丸めでも 2 になります。 ※ ゼロは奇数ではなく、偶数です 値によって丸められ方が変わる偶数丸めですが、何がメリットがあるかというと、丸めた値の合計などを求めるときにあります。値を丸めてしまうと実際の値とは異なった値になってしまうため、誤差が生じてしまいます。このとき、四捨五入よりも偶数丸めの方が誤差が少ないというメリットがあります。 ところで、言語によって round 関数で実装されている丸め方は違います。エクセルでは四捨五入ですが、VBAだと偶数丸めです。round 関数を使用する場合、使用している言語の仕様を調べておくとトラブルを回避できるかと思います。 さてさて、実際に SAS でのそれぞれの関数の違いを見てましょう。 (コード内に使用している proc report の指定行を強調する方法については、 proc report 指定行(◯行目)を強調する - SAS をご参考ください。) /* ORG で指定した数に対して、10回 数値ADDを加算していき、 */ /* 加算していくたびに、ROUNDで指定した桁で丸め処理を実施する