目 次 注 SAS8.2 SAS9.1.3 を 想 定 して 作 成......1 MS-Excel への 掃 きだし (DDE 編 )......2 MS-Excel への 掃 きだし (export 編 ).........2 フォーマットを SAS データセットから 取 り 込 む......5 出 力 にヘッダー ヘッダー フッター フッターを 付 ける.........5 改 行 コード 除 去......5 変 数 var1 から 改 行 コード 除 去......5 変 数 var1 から 改 行 コード 除 去......5 pdf ファイルへの 出 力......6 html ファイルへの 出 力......6 word ファイルへの 出 力......6 SAS のアウトプットウインド アウトプットウインドへの 出 力 停 止......6 SAS 日 付 値......7 年 月 日 フォーマット ( 例 format date yymmdds.;)......7 時 間 フォーマット......7 日 時 フォーマット......7 年 齢 の 計 算......7 CSV ファイルへの 出 力......8 CSV ファイルの 読 み 込 み......8 永 久 SAS データセット......11 複 数 SAS ファイルを 連 続 してサブミット サブミットする......11 フォルダのお 掃 除......11 注 SAS8.2 SAS9.1.3 を 想 定 して 作 成
MS-Excel への 掃 きだし (DDE 編 ) SAS データセット 名 dum の 変 数 X1 X2 X3 X4 を TEST.xls の Sheet1 の 4 行 4 列 か ら 4 行 5 列 と Sheet2 の 4 行 6 列 から 4 行 7 列 に 掃 きだす 場 合 下 記 のように 記 述 する x "'TEST.xls'";*EXCEL 起 動 ; filename XXX1 dde "excel [TEST.xls]sheet1!R4C4:R4C5" ; * 出 力 場 所 1; filename XXX2 dde "excel [TEST.xls]sheet2!R4C6:R4C7" ; * 出 力 場 所 2; *データ 出 力 1; data _null_; set dum; file XXX1 dlm='09'x notab dsd lrecl=1000; put X1 X2; *データ 出 力 2; data _null_; set dum; file XXX2 dlm='09'x notab dsd lrecl=1000; put X3 X4; 手 動 で TEST.xls を 開 いておけば x "'TEST.xls'"; は 不 用 ちなみに x "start excel"; とすると 新 規 excel を 起 動 する filename のあとの X と file のあとの XXX1 や XXX2 は 名 前 が 同 じであればなんでもよい '09'X は TAB キーを 意 味 する(WINDOWS) PUT X1 X2; PUT X2 X3; とした 場 合 以 下 のように 改 行 される 列 1 列 2 行 1 X1 X2 行 2 X3 X4 掃 き 出 すデータが 多 い 時 には lrecl=1000 を 変 える 1~1,048,576(1MB) 範 囲 の 指 定 R4C2:R7C3 は R1C1 参 照 形 式 を 使 用 できる EXCEL のメニューの ツール オ プション 全 般 タブの R1C1 参 照 形 式 を 使 用 する にチェックを 入 れると EXCEL で R1C1 形 式 表 示 されるようになる MS-Excel への 掃 きだし (export 編 ) ライブラリ sam の SAS データセット dum を c:\test.xls のシート test に 掃 きだす 場 合 下 記 のように 記 述 する PROC EXPORT DATA= sam.dum DBMS=Excel FILE='c:\test.xls' REPLACE; SHEET= test ; DBMS=Excel とすると Excel 97 2000 2002 対 応 で 出 力 REPLACE をつけると 上 書 き 出 力 既 に c:\test.xls が 存 在 している 場 合 に REPLACE をつけないと 掃 きだしが 取 り 消 される NEWFILE=YES; とすると c:\test.xls を 新 規 作 成 して 出 力 する NO だと 上 書 き 出 力 c:\test.xls は 閉 じておく セルの 表 示 形 式 が 標 準 のため 小 数 点 以 下 9 桁 までしか 表 示 されないので 注 意
MS-Excel Excelからの 取 り 込 み(DDE 利 用 ) TEST.xls の Sheet1 の 4 行 4 列 から 4 行 5 列 をライブラリ sam の SAS データセット dum に 取 り 込 む 場 合 下 記 のように 記 述 する filename X dde "excel [TEST.xls]sheet1!R4C4:R4C5"; data sam.dum; infile X notab dlm='09'x dsd missover; informat 変 数 X1 (フォーマット 名 1) ( 変 数 Xn) (フォーマット 名 n); input 変 数 X1 変 数 Xn; length 変 数 X1 変 数 長 1 変 数 Xn 変 数 長 n; missover オプションを 指 定 すると 該 当 ファイルのレコードを 読 み 込 む 際 全 ての 変 数 を 読 み 込 む 前 にレコードが 終 端 に 来 た 場 合 に 残 りの 変 数 を 欠 損 値 として 扱 う 変 数 長 は 文 字 型 の 場 合 は $1000 のように$つきで 指 定 する MS-Excel Excelからの 取 り 込 み(libname 利 用 ) ライブラリ sam に c:\test.xls を SAS データセットとして 取 り 込 む Libname sam c:\test.xls ; V9 であれば 可 能 MS-Excel Excelからの 取 り 込 み(Import (Importプロシジャ プロシジャ) c:\test.xls の Sheet1 の 4 行 4 列 から 10 行 11 列 をライブラリ sam の SAS データセッ ト dum に 取 り 込 む 場 合 下 記 のように 記 述 する PROC IMPORT DBMS=EXCEL OUT= sam.dum DATAFILE= "c:\test.xls" REPLACE ; VERSION='2002'; SHEET="sheet1"; GETNAMES=YES; SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; DBSASLABEL=NONE; TEXTSIZE=512; MIXED=YES VERSION='2002'; Excel のバージョンを 指 定 97 2000 2002 SHEET="sheet1"; 取 り 込 むシート 名 を 指 定 代 わりに range='sheet1$a12:g23'; とすると sheet1 の 12 行 1 列 から 23 行 7 列 を 取 り 込 む GETNAMES=YES; EXCEL の 最 初 の 行 の 値 を SAS データの 列 の 変 数 名 とする SCANTEXT=YES; EXCEL の 全 行 をチェックして SAS データセットの 各 変 数 の 桁 数 を 決 定 する USEDATE=YES; 日 付 時 間 の 列 に DATE フォーマットをあてる SCANTIME=YES; 時 間 の 列 をチェックし 特 定 する DBSASLABEL=NONE; SAS データセットに 自 動 的 にラベルをつけない TEXTSIZE=512; テキストの 最 大 桁 数 1 から 32767 MIXED=YES 数 字 とテキストが 混 合 することを 考 慮 する
フォーマットの 基 本 数 値 型 フォーマット 作 成 例 1 PROC FORMAT; value cat_effa 0=' 影 響 はなかった' 1=' 少 し 影 響 した' 2=' 影 響 した' 3='かなり 影 響 した'; 数 値 型 フォーマット 作 成 例 2 PROC FORMAT; value cat_effb Low-<10=1 10-20=2 2-30=3 30<-High=4; 文 字 型 フォーマット 作 成 例 PROC FORMAT; value $cat_effc 0 =' 影 響 はなかった' 1 =' 少 し 影 響 した' 2 =' 影 響 した' 3 ='かなり 影 響 した'; 変 数 var にフォーマット cat_effa をあてる 例 data Y; set X; format var cat_effa. ; あてたフォーマットを 外 す 例 data Y; set X; format code ; frec プロシジャや by ステートメント class ステートメントはフォーマット 後 の 値 を 参 照 す るため 例 えば cat_effb でフォーマットし 層 別 解 析 を 行 なうことも 可 能 ただし means プ ロシジャはフォーマット 前 の 値 を 参 照 している
フォーマット 内 容 の 確 認 ライブラリ sam のフォーマットを 確 認 PROC FORMAT LIB=sam FMTLIB; ライブラリ sam のフォーマット 一 覧 をライブラリ sam の SAS データセット fom に 出 力 PROC FORMAT LIB=sam CNTLOUT=sam.fom; フォーマットを SAS データセットから 取 り 込 む ライブラリ sam の sas ファイル form の 内 容 をフォーマットとして 取 り 込 む PROC FORMAT CNTLIN=sam.form; 最 低 限 FMTNAME (フォーマット 名 ) START ( 値 ) LABEL (フォーマットのラベル) の 3 変 数 が 必 須 必 要 に 応 じて END ( START と 併 せて 数 値 の 範 囲 を 書 く)を 使 う 変 数 TYPE を C としておくと 文 字 型 変 数 となる CNTLOUT オプションを 使 って 作 られたデータセットを 見 ると 設 定 できる 変 数 が 分 かる 出 力 にヘッダー ヘッダー フッター フッターを 付 ける アウトプットにヘッダー フッターをつける 場 合 ヘッダーは TITLE フッターは FOOTNOTE が 対 応 している TITLE ヘッダー ; FOOTNOTE フッター ; 複 数 行 にわたって 書 きたい 時 は TITLE1 ヘッダー ; TITLE2 ヘッダー2 行 目 ; TITLE1 から TITLE10 まで 可 能 TITLE1 の 次 に TITLE 3 を 書 いた 場 合 1 行 空 く 逆 に 設 定 し た 後 で 外 す 場 合 は 以 下 のようにする TITLE; FOOTNOTE; 仮 に TITLE1,2 を 設 定 したとしても その 後 TITLE1 を 設 定 すればそれまでの TITLE1,2 は 書 き 換 えられる 改 行 コード 除 去 変 数 var1 から 改 行 コード 除 去 var1 =COMPRESS(var1,'0A'X '0D'X); 改 行 コードを 全 角 空 白 に 置 き 換 え 変 数 var1 から 改 行 コード 除 去 var1=tranwrd(var1,'0a'x," "); var1=tranwrd(var1,'0d'x," ");
pdf ファイルへの 出 力 ods pdf file="c:\dummy.pdf"; *pdf ファイルへの 出 力 開 始 ; * 挟 まれた 部 分 のアウトプットが PDF ファイルに 出 力 される; ods pdf close; *pdf ファイルへの 出 力 終 了 ; html ファイルへの 出 力 ods html file="c:\dummy.html"; *html ファイルへの 出 力 開 始 ; * 挟 まれた 部 分 のアウトプットが html ファイルに 出 力 される; ods html close; *html ファイルへの 出 力 終 了 ; word ファイルへの 出 力 ods rtf file="c:\dummy.doc"; *word ファイルへの 出 力 開 始 ; * 挟 まれた 部 分 のアウトプットが word ファイルに 出 力 される; ods rtf close; *word ファイルへの 出 力 終 了 ; SAS のアウトプット アウトプットウインド ウインドへの 出 力 停 止 ods noresults; *アウトプットウインドへの 出 力 停 止 ; ods results; *アウトプットウインドへの 出 力 再 開 ; プログラムの 自 動 起 動 X コマンドが 利 用 可 能 OPTIONS NOXWAIT NOXSYNC; X "start excel"; OPTIONS NOXWAIT NOXSYNC; には 次 のオプションを 指 定 可 能 xwait X コマンドで SAS システムから 制 御 した 後 再 度 SAS システムに 戻 るには exit を 入 力 する noxwait X コマ ンドで SAS システムから 制 御 した 後 自 動 的 に 再 度 SAS システムに 戻 る xsync X コマン ドで 開 始 した 処 理 が 終 了 するまで SAS システムに 戻 らない noxsync X コマンドで 開 始 した 処 理 の 終 了 を 待 たずに SAS システムに 戻 る これを 使 う 場 合 は EXCEL を 起 動 してシートにデータを 出 力 した 後 で ファイル 名 を 指 定 してセ ーブする 必 要 がある 名 前 をつけて 保 存 し 閉 じる 命 令 もある ちなみに X "start notepad"; なら メモ 帳 が 起 動 X start excel "c:\test.xls" ; なら D:\aa aa\dummy.xls を MS-Excel で 開 く
SAS 日 付 値 *datetime sas 日 時 値 date sas 日 付 値 (date は DATEPART(datetime)と 同 じ) DATE() 現 在 の 年 月 日 を SAS 日 付 値 で 返 す DATEPART(datetime) SAS 日 時 値 の 日 付 部 分 を SAS 日 付 値 で 返 す DATETIME() 現 在 の 日 時 を SAS 日 時 値 として 返 す DAY(date) SAS 日 付 値 ( 年 月 日 )から 日 にちを 返 す DHMS(date,hour,minute,second) 指 定 した sas 日 時 値 を 返 す(date は sas 日 付 値 ) HMS(hour,minute,second) 指 定 した sas 時 間 値 を 返 す HOUR(datetime) SAS 日 時 値 の 時 間 部 分 を 返 す INTCK( interval,date1,date2) date1 から date2 の 間 に interval(year や month や day 等 )が 何 回 変 わるかを 返 す INTNX( interval,date,n) sas 日 付 値 date の interval(year や month や day 等 )を n だけ 増 減 させた sas 日 付 値 を 返 す * 注 07/07/07-(month+1) 07/08/01 07/07/07-(year+1) 08/01/01 INTNX(interval,date,n, sameday ) interval(year や month) 以 外 は 変 わらない MDY(month,day,year) 指 定 した sas 日 付 値 を 返 す MINUTE(datetime) SAS 日 時 値 の 分 を 返 す MONTH(date) SAS 日 付 値 の 月 を 返 す SECOND(datetime) SAS 日 時 値 の 秒 を 返 す TIME() 現 在 の 時 間 を SAS 時 間 値 で 返 す TIMEPART(datetime) SAS 日 時 値 の 時 間 部 分 を SAS 時 間 値 で 返 す WEEKDAY(date) sas 日 付 値 の 曜 日 を 返 す * 注 1 が 日 曜 日 ~7 が 土 曜 日 を 表 す downame または jdatewk でフォーマットすると 曜 日 表 記 になる year(date) SAS 日 付 値 の 年 を 返 す 年 月 日 フォーマット ( 例 format date yymmdds.;) yymmdds 07/08/16 date 16AUG07 ddmmyy 16/08/07 jdateydw 07 年 8 月 16 日 jdateymd 07 年 8 月 16 日 jnengo 平 成 19 年 8 月 16 日 jnengow 平 成 19 年 8 月 16 日 mmddyy 08/16/07 nengo H.19/08/16 nldate 2007 年 08 月 16 日 nldatew 07 年 08 月 16 日 木 weekdate Thursday, August 16, 2007 weekdatx Thursday, 16 August 2007 worddate August 16, 2007 worddatx 16 August 2007 year 2007 yymmdd 07-08-16 17422 (yymmddb10.) 2007 09 13 (yymmddc10.) 2007:09:13 (yymmddd10.) 2007-09-13 (yymmddn10.) 20070913 (yymmddp10.) 2007.09.13 (yymmdds10.) 2007/09/13 時 間 フォーマット hhmm 4:50 hour 17 jtimeh 17 時 jtimehm 17 時 10 分 jtimehms 17 時 10 分 02 秒 jtimehw 17 時 jtimemw 17 時 10 分 jtimesw 17 時 10 分 02 秒 nldatmtm 17 時 10 分 02 秒 nltimap 5:10:02 PM nltime 17 時 10 分 02 秒 time 17:10:02 日 時 フォーマット datetime 16AUG07:17:23:20 jdateyt 07 年 8 月 16 日 17 時 23 分 jdateytw 07 年 8 月 16 日 17 時 23 分 jnengot 平 成 19 年 8 月 16 日 17 時 23 分 jnengotw 平 成 19 年 8 月 16 日 17 時 23 分 nldatm 2007 年 08 月 16 日 17 時 23 分 19 秒 nldatmap 2007 年 08 月 16 日 午 後 05 時 23 分 19 秒 年 齢 の 計 算 birth 誕 生 日 の SAS 日 付 値 current 年 齢 を 計 算 する 日 ( 同 意 取 得 日 等 )の sas 日 付 値 age=intck('year', birth, current); if (month(current) < month(birth)) then age=age - 1; else if (month(current) = month(birth)) and day(current) < day(birth) then age=age - 1;
CSV ファイルへの 出 力 WORK ライブラリの SAS データセット data を dummy.csv で 出 力 する PROC EXPORT DATA= work.data OUTFILE= "c:\dummy.csv" DBMS=CSV REPLACE; DATA オプション 変 換 元 の SAS データセットを ライブラリ 参 照 名.データセット 名 形 式 で 指 定 OUTFILE オプション 出 力 する CSV ファイルのパスとファイル 名 を 指 定 する DBMS オプション CSV ファイルの 場 合 は CSV を 指 定 する REPLACE オプション 出 力 CSV ファイルが 存 在 したら 置 き 換 えを 行 なう 場 合 に 指 定 する CSVファイル ファイルの 読 み 込 み PROC IMPORT OUT= Work.data DATAFILE=" c:\dummy.csv " DBMS=CSV REPLACE; GETNAMES=YES; DATAROW=2; GUESSINGROWS=500; OUT オプション 出 力 する SAS データセットを ライブラリ 参 照 名.データセット 名 形 式 で 指 定 DATAFILE オプション 入 力 する CSV ファイルのパスとファイル 名 を 指 定 する DBMS オプション CSV ファイルの 場 合 は CSV を 指 定 する REPLACE オプション 出 力 データセットが 存 在 したら 置 き 換 えを 行 なう 場 合 に 指 定 する GETNAMES ステートメント 先 頭 行 を 変 数 名 として 使 う 場 合 は YES を 指 定 する DATAROW ステートメント データの 開 始 行 を 指 定 する GUESSINGROWS オプション 先 頭 から 指 定 行 までのデータを 事 前 に 読 み 込 み データの 判 定 を 行 なわ せる デフォルトは 20 この 値 を 増 やすことで 21 行 目 以 降 に 最 大 長 のデータが 存 在 する 場 合 の 文 字 切 れを 回 避 する 最 大 は 32767 であるが 増 やすと 読 み 込 みが 遅 くなる
SASデータセット データセットの 加 工 ( 元 データ) data ccc; input item X Y; datalines; 1 1 2 2.. 3 4 5 ; ( 加 工 例 1) data ccc1;set ccc; t="x"; h=x;it=item;output; t="y"; h=y;it=item;output; drop x y item; ( 出 力 ) t h it X 1 1 Y 2 1 X. 2 Y. 2 X 4 3 Y 5 3 ( 加 工 例 2) proc transpose data=ccc out=ccc2; ( 出 力 ) 前 の 変 数 名 COL1 COL2 COL3 item 1 2 3 X 1. 4 Y 2. 5 ( 加 工 例 3) data ccc31 ccc32 ccc33;set ccc1; if it=1 then output ccc31; if it=2 then output ccc32; if it=3 then output ccc33; drop it; data ccc3; merge ccc31(rename=(h=t1)) ccc32(rename=(h=t2)) ccc33(rename=(h=t3)); by t; ( 出 力 ) t T1 T2 T3 X 1. 4 Y 2. 5
( 元 データ) data ccc5; input no group id count; datalines; 1 1 1 11 2 1 2 12 3 2 2 13 ; ( 加 工 例 4) proc transpose data=ccc5 out=ccc6(drop=_name_) ; var count; by group; ( 出 力 ) group COL1 COL2 1 11 12 2 13. 注 出 力 結 果 意 図 しないものになっている 加 工 例 5のように id を 指 定 する ( 加 工 例 5) proc transpose data=ccc5 out=ccc7(drop=_name_) ; var count; by group; id id; ( 出 力 ) group COL1 COL2 1 11 12 2. 13
永 久 SASデータセット libname test 'c:\test'; data test.dummy; set work. dummy; *1 行 目 は test という 永 久 SAS データセットの 保 存 先 を 指 定 している このフォルダは 事 前 に 作 成 しておく 必 要 有 り *2 行 目 以 降 で work の SAS データセット dummy を ensyu に 保 存 している proc copy in=work out=dum1; select data1; ライブラリ WORK の SAS データセット data1 をライブラリ DUM1 にコピーする Select ステートメントをつけない 場 合 はライブラリ WORK の SAS データセットをフォーマットファイル ごと 全 部 コピーする 複 数 SASファイル ファイルを 連 続 してサブミット サブミットする FILENAME saspgm 'c:\test'; %INCLUDE saspgm( "test1.sas" "test2.sas" "test3.sas") / SOURCE2; * 一 行 目 は sas ファイルがあるフォルダを 指 定 している ; フォルダのお 掃 除 ライブラリ sam のデータを 全 削 除 proc datasets lib=sam kill ; データセットのコンペア 作 成 したデータセットの 比 較 (DUM1 に 基 準 DUM2 にもう 一 人 が 作 成 したものがあるとする) libname DUM1 'c:\dataset\da1'; libname DUM2 'c:\dataset\da2'; OPTIONS FMTSEARCH=(DUM1 DUM2) NOFMTERR; %macro comp(files); proc compare data=dum1.&files comp=dum2.&files allobs; %mend; %comp(dummy1 ); %comp(dummy2 ); %comp(dummy3 ); フォーマットをはずしてコンペアしたほうが 差 異 が 見 やすいかも フォーマットの 一 致 はformatプロシジャでフォーマット 一 覧 をSASデータセットに 出 力 したもの 同 士 をコンペアするのも1つの 方 法