ラベル [▼ ゼロパディング の投稿を表示しています。 すべての投稿を表示
ラベル [▼ ゼロパディング の投稿を表示しています。 すべての投稿を表示

2013年11月20日水曜日

文字の先頭をゼロ埋めして桁数を揃える。



他のプログラム言語とかでもよく出てくる「ゼロパディング」といわれる問題。


例えば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関数の小技 を参照。