web-dev-qa-db-ja.com

SASの文字フィールドに先行ゼロを追加するにはどうすればよいですか?

私は次のことを理解しようとしています:idnum3、idnum897、idnum2342345などの異なる長さの文字変数を持つSASデータセット 'ids'があります。同じ長さの各IDを作成し、先頭を追加する必要があります'000000idnum3'、 '0000idnum897'、idnum2342345のような落ち着きのあるゼロ。多くのオプションを試しましたが、何も機能しないようです。提案をお願いします。ありがとうございます。

5

ここでは、2つの一般的なアプローチが役立ちます。

まず、フィールドが完全に数値の場合は、_Zw.d_形式を使用します。

_idnum=put(input(idnum,8.),z8.);
_

完全に数値でない場合は、repeat()を使用してゼロを生成します。 length()を使用して、必要な数を見つけます。 Repeatは、繰り返される文字と、元の文字に追加する繰り返しの数の2つの引数を取ります。その数は、直感的な数より1つ少なくなります:repeat('0',3) = _0000_。

そう:

_  if length(idnum) lt 8 then idnum = cats(repeat('0',8-1-length(idnum)),idnum);
_

ID番号変数が完全なIDに適合するのに十分な長さであることも確認してください。そうしないと、これは機能しません。

より長い例:

_data have;
input idnum $8.;
datalines;
idn2
idn234
idn23456
;;;;
run;

data want;
  set have;
  if length(idnum) lt 8 then idnum = cats(repeat('0',8-1-length(idnum)),idnum);
run;
_
5
Joe

私は毎日この問題を抱えています。 Znのフォーマット。あなたが必要なものをあなたに与えるべきです。たとえば、個人の社会保障番号が000012345であるSSN(文字番号)があるとします。これをExcelまたはテキストファイルから読み込むと、12345になってしまう可能性があります。 Zn.の形式を使用して、先行ゼロを作成できます-

Data Want;
Set Have;
SSN = PUT(VALUE,Z9.);
RUN;
3
SMW

より直感的な場合は、適切な関数と組み合わせてtranslateを使用することもできます。フィールドの値を右揃えにして、作成されたスペースをゼロに置き換えるという考え方です。

data have;
    input id $16.;
    datalines;
    idnum3 
    idnum897  
    idnum2342345
    ;
run;

data want;
    set have;
    want = translate(right(id), "0", " ");
run;
2
superfluous