他のプログラム言語とかでもよく出てくる「ゼロパディング」といわれる問題。
例えば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関数」を使ってゼロを埋めてる。
方法③
個人的には使ってる関数も少なくて一番スマートだと思う。
数値変数の場合でも適用可。
その後、左側に出来た半角スペースを「tranwrd関数」でゼロに置換えてる。
「put関数」の「-R」については PUT関数の小技 を参照。