他のプログラム言語とかでもよく出てくる「ゼロパディング」といわれる問題。
例えば5桁に揃えたい場合は、
「123」→「00123」
「AB」 →「000AB」
みたいな感じに加工する方法。
ゼロ埋め対象が数値変数の場合
data DT1;
length V1 $5.;
V0 = 123;
V1 = put(V0, z5.);
run; |
「Zw.dフォーマット」というのが用意されてて「z桁数」と指定するだけでok。
ゼロ埋め対象が文字変数の場合
data DT2;
length V0 $3. V1-V3 $5.;
V0 = "ABC";
V1 = reverse(substr(reverse(cats("00000",V0)),1,5)); * 方法① ;
V2 = cats(repeat("0",4-lengthn(V0)),V0); * 方法② ;
V3 = tranwrd(put(V0, 5.-R),' ','0'); * 方法③ ;
run; |
だいたい上記3つのやり方が思い浮かぶ。
方法①
ごり押し感あるやり方。
「cats関数」で「00000ABC」という文字にする。
「reverse関数」で「CBA00000」と逆にしてから、
「substr関数」で先頭5文字を抽出「CBA00」
また「reverse関数」でもとの順に戻せば完成。
非効率だけどきらいじゃない。
追記
上記と同じ原理、かつもっといい方法を教えてもらいました。
V1 = put(put('00000'||V0 ,$revers8.),$revers5.);
put関数にも文字を逆さまにする「$revers」というformatがある。
うまいのが「$revers5」で、5文字に切りつつ、もとの順に戻してるところ。
|
方法②
変数「V0」から不足してる文字の長さ分だけ「repeat関数」を使ってゼロを埋めてる。
方法③
個人的には使ってる関数も少なくて一番スマートだと思う。
数値変数の場合でも適用可。
ポイントは「put関数」で5文字の長さにして「-R」を使って文字を右詰して「 ABC」としてるところ
その後、左側に出来た半角スペースを「tranwrd関数」でゼロに置換えてる。
「put関数」の「-R」については
PUT関数の小技 を参照。