VimでSASを書く実際のワークフロー(使い方編)
導入編で入れた「SASIDE」を、実際の業務でどう使うかをシナリオ順に説明します。
コマンドの網羅的な一覧はリファレンス編を参照してください。
1. まず覚える3つ
これだけで日常の8割が回ります。
| キー | 意味 |
|---|---|
| F5 | 保存してSAS実行 → ログが下に開く → ERROR/WARNINGがquickfixに並ぶ |
| F12 | IDEレイアウト(左ツリー・中央エディタ・右構造ビュー・下ログ)を一発構築 |
| \rc | 構文チェック(データを処理せず、数秒で文法エラーだけ検出) |
\ は Leader キーです(既定のまま)。\rc は「バックスラッシュ → r → c」と
順に押します。
2. 一日の始まり:F12で作業環境を開く
vim report.sas
を開いて F12 を押すと、こうなります。
┌──────────┬──────────────────────────┬────────────┐
│ Explorer │ Editor │ Navigator │
│ (F2) │ (編集領域) │ (F3) │
├──────────┴──────────────────────────┴────────────┤
│ Log (F6) / quickfix │
└──────────────────────────────────────────────────┘
-
左(Explorer): ファイルを開く・作る・消す。
Enterで開く、aで新規作成 -
右(Navigator): このプログラムのDATA/PROC/%MACRO一覧。
Enterでその行へジャンプ - 下(Log): 実行後にログが出る
広すぎると感じたら各ペインで q を押せば閉じられます。幅は
let g:saside_navigator_width = 28 のようにvimrcで調整できます。
3. 書く:補完とスニペット
骨格をスニペットで出す
挿入モードで datastep と打って Ctrl+j:
data <+out+>; ← カーソルがここに来る(プレースホルダは消える)
set <+in+>;
<+statements+>
run;
出力データセット名を打ったら、また Ctrl+j で次の set の位置へ飛びます。
主なキーワード: datastep sql sortds meansds freqds macrodef
doloop selwhen importcsv exportcsv
補完はTab
-
subst+ Tab →substr [func](SAS関数辞書。説明付き) -
&cut+ Tab →&cutoff_high.(このファイル内で%let済みのマクロ変数) -
%sys+ Tab →%sysfunc [macro] -
work.の続き + Tab → このファイルで使われているデータセット名
先頭候補が選択された状態で出るので、そのまま Enter で確定できます。
括弧・クオートは自動で閉じる
( を打てば () になりカーソルは中。閉じ括弧を自分で打っても二重にならず
素通りします。don't のような語中アポストロフィは誤爆しません。
4. 実行する:3つの粒度を使い分ける
ここがSAS開発の肝です。毎回フルで流さないのがコツ。
(a) 構文チェックだけ(\rc)— まず これ
\rc
-obs 0 -noreplace を付けて実行します。データを1件も読まないので、
数百万件のローンデータを扱うプログラムでも数秒で終わり、
タイプミス・セミコロン漏れ・存在しない変数名だけを先に潰せます。
永久データセットを上書きしないので安全です。
「とりあえず\rc → 通ったらF5」を習慣にすると、待ち時間が激減します。
(b) 今書いているステップだけ(\rb)
カーソルをDATAステップやPROCの中に置いて \rb。
そのブロック(data 〜 run;)だけを切り出して実行します。
(c) 選んだ範囲だけ(ビジュアル + F5)
V で行選択して範囲を広げ、F5。選択範囲だけ実行されます。
重要: (b)(c)の部分実行では、選択範囲より前にある
LIBNAME/
OPTIONS/%LETが自動で先頭に付与されます。だから
「PROC MEANSだけ選んで実行したらライブラリが無いと言われる」という
部分実行あるあるが起きません。不要ならlet g:saside_run_preamble = 0。ただしマクロ定義(
%macro)が前提のコードは、マクロ定義ごと選択範囲に
含めてください。ここは自動化していません。
(d) 全部流す(F5)
最終確認はこれ。未保存なら自動で保存してから実行します。
実行を中断したくなったら :SasAbort。
5. ログを読む:ここが一番差が出る
実行が終わると、下ペインにログが色分け表示され、
ERROR/WARNINGが自動でquickfixに入ります。
[saside] SAS終了 exit=1 / ERROR+WARNING 2件 / 危険NOTE 8件
ERROR/WARNINGを潰す
- quickfixで Enter → ログの該当行へジャンプ
-
:cnext/:cprevで次・前へ - ログペイン内では
]e[eで次/前のERROR、]w[wでWARNINGへ移動
危険NOTEを確認する(\lr)— ここが本題
SASで一番怖いのはERRORではありません。 エラーにならずに処理が続行し、
黙って誤った結果を出すNOTEです。\lr を押すと、それらだけが理由付きで
quickfixに並びます。
[変数が未初期化(変数名のタイプミス・定義漏れの可能性)] NOTE: Variable ZANDAKA is uninitialized.
[MERGEでBY値が重複(意図しない結合・件数増加の典型例)] NOTE: MERGE statement has more than one...
[不正なデータ(型変換に失敗し欠損値になっている)] NOTE: Invalid numeric data, KINGAKU='ABC'...
[出力が0件(抽出条件・結合条件の誤りの可能性)] NOTE: The data set WORK.RESULT has 0 observations.
[ゼロ除算(結果が欠損値になっている)] NOTE: Division by zero detected...
検出対象は、未初期化変数・不正データ・MERGEのBY重複・ゼロ除算・桁あふれ・
暗黙の型変換・欠損値発生・出力0件・INPUT行またぎ・LOST CARD・変数長不一致など。
「exit=0 だから成功」ではありません。 \rc で構文を通し、F5 で流し、
最後に \lr で黙って壊れていないかを確認する——この3段階が実務での安全な流れです。
自社特有のチェックを足したい場合はvimrcで追加できます。
let g:saside_log_risk_patterns = [
\ {'pat': 'has 0 observations', 'desc': '出力0件(要確認)'},
\ {'pat': '独自の警告文言', 'desc': '説明'},
\ ]
PROC出力(.lst)を見る
F7 で .lst(PROC PRINTなどの出力結果)を下ペインに表示します。
6. 直す:整形とナビゲーション
コードを整える(F9)
インデントの再計算・行末空白の除去・連続空行の圧縮を一括で行います。
undo 1回で全部戻せます。
予約語を大文字にしたい場合は let g:saside_format_upcase = 1
(文字列とコメントの中は保護されます)。
一部だけ整えたいときは、範囲選択して =。
1ブロックだけなら =%(% のブロックジャンプと組み合わせ)。
移動する
| キー | 動作 |
|---|---|
]] / [[
|
次 / 前の DATA・PROC・%MACRO へ |
% |
DO↔END、%DO↔%END、%MACRO↔%MEND、DATA/PROC↔RUN/QUIT
|
F3 → Enter |
Navigatorの一覧からジャンプ |
K |
カーソル下のSAS関数・PROCの説明を表示 |
探す
| キー | 動作 |
|---|---|
\sg |
プロジェクト全体を検索(**/*.sas **/*.txt) |
\sd |
カーソル下のデータセット名の使用箇所(set/merge/from/join に絞る) |
\sm |
カーソル下のマクロの定義と呼び出し |
F10 |
TODO / FIXME / BUG の一覧 |
一括置換の定石:
:SasGrep old_dataset_name
:cdo s/old_dataset_name/new_name/gc | update
7. 構造を把握する:4つのビュー
大きなプログラムを引き継いだときに効きます。右ペイン(F3)を開いて、
中で 1 2 3 4 を押すと表示が切り替わります。
| キー | ビュー | 何が見えるか |
|---|---|---|
1 |
Navigator | 種別ごと(MACRO / DATA / PROC / LIBNAME / ODS…) |
2 |
Outline | 出現順のフラットな一覧 |
3 |
Dataset | 入力(SET/MERGE/FROM/JOIN)と出力(DATA/CREATE TABLE)のデータセット一覧 |
4 |
Macro |
%macro 定義と引数リスト |
特に Dataset ビュー(3) は、他人が書いた1000行のプログラムで
「結局どのライブラリの何を読んで、何を作っているのか」を数秒で把握できます。
編集すると約0.3秒後に自動更新されます。
8. 作業を中断・再開する
:SasSessionSave 案件A " 開いているファイルとペイン構成を保存
:SasSessionLoad 案件A " 復元
気になる行には \bb でブックマーク(名前を付けて保存)。
\bl で一覧表示 → Enterでジャンプ。Vimを閉じても消えません。
9. 実務での推奨フロー(まとめ)
1. F12 作業レイアウトを開く
2. コードを書く Tab補完 / Ctrl+j スニペット
3. \rc 構文チェック(数秒)→ エラーがあればここで潰す
4. \rb または V+F5 書いた部分だけ試し実行
5. F5 全体を実行
6. F8 → quickfix ERROR/WARNING を潰す
7. \lr 危険NOTE を確認 ← ここを飛ばさない
8. F9 コミット前に整形
3と7が、他のエディタでは得られにくい部分です。
10. つまずいたら
| 症状 | 対処 |
|---|---|
| ペーストでVimが固まる | 貼る前に F11(貼り終えたら再度F11) |
\rc で SAS が見つからない |
let g:saside_sas_cmd = '/フルパス/sas' |
| 部分実行でライブラリが無いと言われる | マクロ定義ごと選択範囲に含める |
| 巨大ログが重い | 10MB超は自動でsyntax offになる。:SasLogErrors で抽出だけ見る |
| Navigatorが更新されない | 2万行超は自動停止する仕様。ペイン内で r を押す |
| キーが他と衝突する |
let g:saside_no_default_maps = 1 で既定割当を全停止し、<Plug> で個別に割当 |
詳細は :help saside またはリファレンス編を参照してください。