今年もあとちょっとですね。
ブログを見てくださった方や、コメントくださった方、皆さん本当に有難うございました!
まだ今年も更新するかもしれませんが、来年もよろしくお願いします!
とりあえず、一度使ってみたかったEXPLODEプロシジャで締めたいと思います。
filename ft15f001 temp; proc explode; parmcards; 1 HAVE A GREAT 2 NEW YEAR!! ; run; |
。。。SAS Studioだと、結果がでないので、
filename ft15f001 temp; proc explode; parmcards; 1 HAVE A GREAT 2 NEW YEAR!! ; run; |
* EXCELを起動 ; options noxwait noxsync; %sysexec "C:\TEST.xlsx"; * 10秒待機 ; data _NULL_; rc = sleep(10,1); run; * EXCELデータを読み込む ; filename EXC dde "Excel|[test.xlsx]Sheet1!C1:C4"; data OUT1; attrib A length=8. B length=$20. C length=8. informat=yymmdd10. format=yymmdds10. D length=8. informat=time5. format=time5. ; /* filenameで読み込む行のみを設定した場合、firstobsオプションは不要 */ infile EXC notab dlm="09"x dsd missover lrecl=50000 firstobs=2; input A B C D; run; * ファイル参照を解放 ; filename EXC clear; OUT1
|
options noxwait noxsync;
%sysexec "C:\TEST.xlsx"; |
data _NULL_;
rc = sleep(10,1); run; |
filename EXC dde "Excel|[test.xlsx]Sheet1!C1:C4";
|
data OUT1; attrib A length=8. B length=$20. C length=8. informat=yymmdd10. format=yymmdds10. D length=8. informat=time5. format=time5. ; /* filenameで読み込む行のみを設定した場合、firstobsオプションは不要 */
infile EXC notab dlm="09"x dsd missover lrecl=50000 firstobs=2; input A B C D; run; |
IMAGE( file: "画像ファイルのフルパス" )
|
data _NULL_;
dcl odsout ob();
ob.image( file: "画像ファイルのパス\flower.jpg" ); run; |
DHMS( 日付値, 時, 分, 秒 ) |
data DT1; format DT yymmdd10. H M S 8. DTM e8601dt19.; * 日付値 ; DT = input("2014/01/10", yymmdd10.); * 時 ; H = 20; * 分 ; M = 10; * 秒 ; S = 00; * 日時値を作成 ; DTM = dhms(DT, H, M, S); run;
|
DHMS( 日付値, 0, 0, 時間値 ) |
data DT1; format DT yymmdd10. TM time5. DTM e8601dt19.; * 日付値 ; DT = input("2014/01/10", yymmdd10.); * 時間値 ; TM = input("20:10", time5.); * 日時値を作成 ; DTM = dhms(DT, 0, 0, TM); run;
|
PAGE()
|
data _NULL_;
dcl odsout ob();
*** 1ページ目 ; ob.table_start(); ob.row_start(); ob.format_cell( data:"aa" ); ob.row_end(); ob.table_end(); ob.page(); *** 2ページ目 ; ob.table_start(); ob.row_start(); ob.format_cell( data:"bb" ); ob.row_end(); ob.table_end(); run; |
LABEL, LENGTH などの変数属性を、まとめて定義できるステートメント。
データステップの一番先頭に書くと、ATTRIBに指定した順番で変数が並んでくれる。 |
*** 適当なサンプルデータ作成 ;
data DT1; retain A B C D E F 1 G "aa" H '20:00't ; run;
*** 要る変数だけ属性定義してKEEPする例 ; data OUT1; attrib A label="あ" length=8. B label="い" length=8. C label="う" length=8. G label="え" length=$10. H label="お" length=8. format=time5. ; set DT1; keep A B C G H; run;
|
keep A -- H ;
|
ods html close; ods pdf file="出力するファイルのパス\test.pdf"; data _NULL_; dcl odsout ob(); * レイアウト設定開始 ; ob.layout_absolute(); * 1個目の表を配置 ; ob.region( x:'1cm', y:'1cm' ); ob.table_start(); ob.row_start(); ob.format_cell(data:"aa"); ob.format_cell(data:"bb"); ob.row_end(); ob.table_end(); * 2個目の表を配置 ; ob.region( x:'5cm', y:'2cm' ); ob.table_start(); ob.row_start(); ob.format_cell(data:"cc"); ob.format_cell(data:"dd"); ob.row_end(); ob.table_end(); ob.layout_end(); run; ods pdf close; ods html;
結果 |
ods html close; ods pdf file="出力するPDFファイルのフルパス";
|
layout_absolute()
|
region( x : 'xの位置' , y : 'yの位置' )
|
layout_end()
|
ods pdf close; ods html; |
*** Sample Data ;
data DT1;
input CODE$ NAME$; cards; 001 AAA 004 DDD 003 BBB 001 AAA 004 DDD 002 CCC 002 CCC ;
|
proc freq data=DT1;
tables CODE * NAME / missing;
|
proc freq data=DT1; tables CODE * NAME / missing list; format _all_; run; |
data DT2; X=" AAA"; output; X="BBB"; output; run; proc freq data=DT2; tables X / missing list; format _all_; run; |
data DT1; format DT yymmdd10. TM time5.; DTM = input("2014/07/01 10:20:00", ymddttm.); * 日付値を抽出 ; DT = datepart( DTM ) ; * 時間値を抽出 ; TM = timepart( DTM ) ; keep DT TM; run;
|
data DT1; A=1; B="AA"; output; A=2; B="BB"; output; run; data DT2; A=2; C=10; output; A=3; C=20; output; run;
DT2
|
proc sql; create table DT3 as select coalesce( DT1.A, DT2.A ) as A , B , C from DT1 full join DT2 on DT1.A = DT2.A ; quit;
基本構文 from データセット1 full join データセット2 on 結合条件 解説 ① 結合時、2つのデータセットの全てのレコードを残します。 (結合条件に合うレコードだけでなく、片方のデータセットにしかないレコードも残す) ② 結合する2つのデータセットで同じ変数名を持っている場合、「データセット名.変数名」と書きます。 (今回の例では、DT1とDT2で同じ変数名Aを持っているので、どっちのAを使うのか明確にするため、「DT1.A」とか「DT2.A」と書いています) ③ SELECTでcoalesceという関数を使ってます。 この関数は、指定した引数の値を順番に見ていって、最初の非欠損値の値を返します。 つまりSELECTの「coalesce( DT1.A, DT2.A )」は、 ・DT1にしか存在しないレコードだったら、DT1.Aの値を持ってくる ・DT2にしか存在しないレコードだったら、DT2.Aの値を持ってくる という事をやっています。 |
data DT1; length A $20. B C 8.; A="xxx"; B=1; C=2; run;
data DT2; length A C $10. D 8.; A="yyy"; C="zzz"; D=3; run;
|
proc compare base=DT1(obs=0) compare=DT2(obs=0) listvar; run ; |
proc compare base=DT1 compare=DT2 listvar novalues ; run ; |
libname MYLIB "C:\TEST"; data DT1; set MYLIB.DT1; run; |
data DT1; set "C:\TEST\DT1"; run; |
data DT1; VAR = '100%'; output; VAR = '100'; output; run;
|
data DT2; set DT1; where VAR like '%#%' escape '#'; run;
|
filename DIR1 "C:\TEST"; data DT1 ; length VAR $400 ; *** ディレクトリを開く ; did = dopen("DIR1") ; *** ファイル・フォルダ名を変数に格納 ; do i = 1 to dnum( did ) ; VAR = dread( did , i ) ; output ; end; rc = dclose( did ) ; run;
|
構文 … DOPEN( "開きたいディレクトリが割り当てられたファイル参照名" ) |
構文 … DNUM( ディレクトリの識別番号 ) |
構文 … DREAD( ディレクトリの識別番号 , メンバの通し番号 ) |
構文 … DCLOSE( ディレクトリの識別番号 ) |
data DT1; A=1; B="AA"; output; A=2; B="BB"; output; run; data DT2; A=2; C=10; output; A=3; C=20; output; run;
DT2
|
proc sql; create table DT3 as select DT1.A , B , C from DT1 left join DT2 on DT1.A = DT2.A ; quit;
from データセット1 left join データセット2 on 結合条件 解説 ・FROMで結合する時、左側に書いたデータセットDT1のレコードだけ残す。 ・DT1とDT2で同じ変数名Aを持ってるので、どっちのAを使うのか明確にするため、「DT1.A」とか「DT2.A」と書いてあげる必要がある。 |
proc sql; create table DT4 as select DT2.A , B , C from DT1 right join DT2 on DT1.A = DT2.A ;
quit;
データセットDT4
基本構文 from データセット1 right join データセット2 on 結合条件 ・FROMで結合する時、右側に書いたデータセットDT2のレコードだけ残す。 |
data _NULL_;
dcl odsout ob(); * グリッドを設定する ; ob.layout_gridded( columns:2, rows:2 ); * 1個目の表を配置 ; ob.region(); ob.table_start(); ob.row_start(); ob.format_cell(data:"aa"); ob.format_cell(data:"bb"); ob.row_end(); ob.table_end(); * 2個目の表を配置 ; ob.region(); ob.table_start(); ob.row_start(); ob.format_cell(data:"cc"); ob.format_cell(data:"dd"); ob.row_end(); ob.table_end(); ob.region(); ob.table_start(); ob.row_start(); ob.format_cell(data:"ee"); ob.format_cell(data:"ff"); ob.row_end(); ob.table_end(); run; |
layout_gridded( columns:列数 , rows:行数 )
|
region()
|
layout_end()
|
data DT1; A=1; B="AA"; output; A=2; B="BB"; output; run; data DT2; A=2; C=10; output; A=3; C=20; output; run;
DT2
|
proc sql; create table DT3 as select DT1.A , B , C from DT1, DT2 where DT1.A = DT2.A ; quit;
基本構文 from データセット1 , データセット2 where 結合条件 ・DT1とDT2で同じ変数名Aを持ってるので、どっちのAを使うのか明確にするため、「DT1.A」とか「DT2.A」と書いてあげる必要がある。 |
proc sql; create table DT4 as select DT1.A , B , C from DT1 inner join DT2 on DT1.A = DT2.A; quit;
基本構文
from データセット1 inner join データセット2 on 結合条件 結果は方法1と同様。 |
リターンコードを格納する変数 = FILEEXIST( "確認したいフォルダまたはファイルのフルパス" ); |
data _null_; length msg $2000.; rc = fileexist("D:\myfolder\test.txt"); if rc^=1 then do; msg=sysmsg(); put msg; end; run; |
%put %sysfunc(date()); ログ 19782 |
%put %sysfunc(putn( %sysfunc(date()) , yymmdd10));
2014-02-28 |
%put %sysfunc(date(), yymmdd10); ログ 2014-02-28 |