PIPE

314 Views

April 16, 25

スライド概要

[第11回大阪sas勉強会]

profile-image

SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

2025-04-16 PIPE 第11回 大阪SAS勉強会 Yugo Miki (グラクソ・スミスクライン株式会社) gsk.com

2.

Disclaimer – This presentation reflects the views of the authors/speakers and does not necessarily represent GSK’s views or policies. – All information provided in this presentation is provided for information purposes only. 2

3.

DOMINO/SAS Studio • • • • • • 現状、DOMINO環境下でプログラムを作成している。 非常に強力なSAS実行環境。 WEB GUIまたはバッチ実行で操作できる。 基本的な使用感はPC版SASと同じ感じで動く。 WEB GUIのファイル操作がそこまで使用感よくない。あくまでWindowsのファイルシステムと比べて。 Zip/Unzipはlinuxのターミナル使ったり、shell script動かしたりする。結構手間がかかる。 15 April 2025 3

4.

とあるコード・・・・ data _null_; infile "echo Hello World!" pipe; input ; put _infile_; run; • • • • NOTE: The infile "echo Hello World!" is: Pipe command="echo Hello World!" Hello World! 変数?_infile_だけ? データを作るわけではない? Input statementは指定なし? putはlogに出力?でも出力なんか違う・・・。 15 April 2025 4

5.

Pipe option • • pipeはSAS環境からlinuxのコマンドを呼び出すことが出来るfilenameのoption。 • 本来は以下のようなコード。なお、infileはpipe optionが使えるらしい。 このオプションでfilename statementが物理ファイルを参照しに行く挙動でなく、参照ファイルのtextをコマンドとして認 識するようになる。 filename command pipe "echo Hello World!" data _null_; infile command; input ; put _infile_; run; • • put _infile_は通常、SAS自動変数である_infile_をlogに打ち出す仕様でなく、コマンド実行するような挙動になる。 infileをobject指定でなく、cardsやdatalines4指定にしてみたが、動かせなかった。 15 April 2025 5

6.

どこで動いているんだ・・・ pwd/cd data _null_; infile “pwd" pipe; ・・・ infile “cd /mnt/data" pipe; ・・・ infile “pwd" pipe; ・・・ infile “cd /mnt/data | pwd" pipe; input ; put _infile_; NOTE: The infile COMMAND is: Pipe command="pwd" …/workspaceserver/default NOTE: The infile COMMAND is: Pipe command="cd /domino/datasets/local" NOTE: The infile COMMAND is: Pipe command="pwd" …/workspaceserver/default run; • • • Current directoryは実行ごとに毎回リセットされる? Cdなどの操作は制限がある気がする。 一方で、絶対path系のコマンドは通りそう。 15 April 2025 6

7.

Linux command: mkdir NOTE: The infile COMMAND is: Pipe command="mkdir /domino/datasets/local/DOMINO/test01" • フォルダできた。 • ということは日付フォルダもできるはず。 15 April 2025 7

8.

Linux command: cp NOTE: The infile COMMAND is: Pipe command="cp -p /domino/datasets/local/DOMINO/patientlist.csv /domino/datasets/local/DOMINO/patientlist2.csv" • 基本のコピーコマンド。動く。 • -p optionも機能する。 15 April 2025 8

9.

Linux command: rm NOTE: The infile COMMAND is: Pipe command=“rm /domino/datasets/local/DOMINO/patientlist2.csv“ NOTE: The infile COMMAND is: Pipe command=“rm -r /domino/datasets/local/DOMINO/test01" • 消えました。 • -r option指定でフォルダも消せる。 15 April 2025 9

10.

Linux command: unzip NOTE: The infile COMMAND is: Pipe command="unzip /domino/datasets/local/DOMINO/gsk123456_sdtm_20250219.zip -d /domino/datasets/local/DOMINO/" Archive: /domino/datasets/local/DOMINO/gsk123456_sdtm_20250219.zip creating: /domino/datasets/local/DOMINO/sdtm/ inflating: /domino/datasets/local/DOMINO/sdtm/ae.json … • 解凍先のフォルダを書かないと通らない。 • Current directoryから操作しているので-d optionで解凍先指定。 15 April 2025 10

11.

Linux command: zip NOTE: The infile COMMAND is: Pipe command="zip –r /domino/datasets/local/DOMINO/sdtm2 /domino/datasets/local/DOMINO/sdtm" • Zip化はフォルダ指定が定番だと思うので-r 指定でフォルダごとzip化。 • 問題なし。 15 April 2025 11

12.

Linux command: xargs NOTE: The infile COMMAND is: Pipe command="find /domino/datasets/local/DOMINO/sdtm -name *.json | xargs -i zip /domino/datasets/local/DOMINO/sdtm3 {}“ adding: domino/datasets/local/DOMINO/sdtm/ae.json (deflated 92%) adding: domino/datasets/local/DOMINO/sdtm/cm.json (deflated 94%) adding: domino/datasets/local/DOMINO/sdtm/dm.json (deflated 87%) adding: domino/datasets/local/DOMINO/sdtm/ds.json (deflated 89%)… • xargは直前のコマンドの結果を引数として、次のコマンドへ渡すことが出来る。 • Findでjsonファイルを検索して、jsonファイルのみをzip化して保存。 • これも問題なし。 15 April 2025 12

13.

Example 1. DOMINO下の所定のフォルダへロードされたzipファイルを解凍し、フォルダへ展開。 2. 一部のデータがあった場合、<処理1>をして上書き保存。 3. すべてのデータに<処理2>を実施。 4. フォルダ内のすべてのデータに対して、CSVを出力し、同じフォルダ内へ保存。 5. 上記のフォルダの名前を処理済みと分かるようにして、zip folderへと圧縮して保存。 15 April 2025 13

14.

Example 1 Load zip file and extract to the directory %let workdir=/domino/datasets/local/DOMINO; %let refdir=/domino/datasets/local/DOMINO; %let exfile=%sysget(FILENAME); data _null_; infile "unzip &workdir./&exfile..zip -d &workdir./" pipe ; input ; put _infile_; run; • Sysgetは環境変数取得。これでファイルごとにプログラムを変更する必要 がなくなる。 • Unzipで解凍し、結果を保存。このzipファイルはフォルダをそのままzip化 したものであるので、解凍するとフォルダが作成される。 15 April 2025 14

15.

Example 2 Set libname and kick macros libname sdtmdata "&workdir./&exfile."; data _null_; set sashelp.vmember; where libname = "SDTMDATA"; if memname in ("RS","TU","TR","SUPPRS","SUPPTU","SUPPTR") then do; call execute(cats(‘%work1(',lowcase(memname),');')) ; end; call execute(cats(‘%work2(',lowcase(memname),');')) ; run; • libnameで解凍したフォルダを指定 。これで、Vmemberからデータセット 名を取得できる。 • データセット名で判定して、マクロ化した処理1、処理2を実施。 15 April 2025 15

16.

Example 3 Zip folder data _null_; infile "zip -r &workdir./&exfile._WKD &workdir./&exfile." pipe ; input ; put _infile_; run; • マクロ変数化したフォルダ名に”_WKD”を付けてzipフォルダ名を作成。 • -r指定でフォルダごと指定し、zipファイル作成。 • ダウンロードはDOMINOのdata画面から操作する。 15 April 2025 16

17.

Summary 1. Pipe optionを使用したプログラムは、PC版SASのXコマンドのようにプログラム開発の 幅を広げてくれる。 2. SAS 9.2からsupportされている一方で、DOMINO SAS Workspaceなど、OnDemand系 の最新の製品でも動く可能性が高く、最新のViya環境でも使用可能と思われる。 3. grepやfindといったlinuxのコマンドを使ってファイル操作ができるので、workspaceか らいろいろ操作できて便利である。 15 April 2025 17

18.

Reference • Using External Files and Devices: Reading from and Writing to UNIX Commands (PIPE) • Solved: Put _infile_ Statement - SAS Support Communities 15 April 2025 18