2011-11-07 17 views
7

私はVARCHAR(5)キーフィールドを含むデータベースからSASデータセットを作成しています。SASの文字フィールドのパディング方法は?

このフィールドには、5文字すべてを使用するエントリと、それより少ないものを使用するエントリが含まれています。

このデータをインポートするときは、5文字すべてを使用するために短い項目をすべて埋め込むことをお勧めします。この例では、左側に0の文字ゼロを埋めたいと思います。したがって、11400114になり、ABCD0ABCDになり、EA222はそのままになります。

私は単純なデータ声明でこれをしようとしましたが、もちろん、次は動作しません:私は、ユーザー定義のinformatでこれを行うにしようとしました

data test; 
    set databaseinput; 
    format key $5.; 
run; 

が、私はしないでくださいthis SAS KB answerごとに文字フィールドに範囲を正しく指定することが可能だと考えてください。さらに、proc形式では、入ってくる変数に関して動的に結果を定義することはできません。

ここに明らかな解決策があると確信していますが、私はそれを見逃しています。

+0

「ABC」はどのように処理しますか?それは '00ABC'でしょうか? – itzy

+0

私の場合、「00ABC」は正しいです。また、コードタグの使用に関する素晴らしい点もあります。オリジナル投稿が更新されました。 –

+0

エントリにスペースを含めることはできますか?例えば ​​'AB_C'や' _AB_'(アンダースコアはスペースを表します)のように? –

答えて

6

は、代替です:

data padded_data_dsn; length key $5; 
    drop raw_data; 
    set raw_data_dsn(rename=(key=raw_data)); 
    key = translate(right(raw_data),'0',' '); 
run; 
2

誰かがより洗練されたソリューションを提供すると確信していますが、次のコードが機能します。基本的に変数に5つの先行ゼロを埋め込み、次にこの文字列の順序を逆にしてゼロが右になるようにしてから、このテキスト文字列を再び反転させ、サイズを5文字に元の順序で制限しますゼロで。ここで

data raw_data_dsn; 
    format key $varying5.; 
    key = '114'; output; 
    key = 'ABCD'; output; 
    key = 'EA222'; output; 
run; 

data padded_data_dsn; 
    format key $5.; 
    drop raw_data; 
    set raw_data_dsn(rename=(key=raw_data)); 
    key = put(put('00000' || raw_data ,$revers10.),$revers5.); 
run; 
+0

この答えを検証するために私を永遠に連れて行きましたが、それは私の問題の原因です。 –

4
Data raw_data_dsn; 
format key $5.; 
key = '4'; key1 = CATT(REPEAT('0',5-length(key)),key);output; 
key = 'A114'; key1 = CATT(REPEAT('0',5-length(key)),key);output; 
key = 'A1140'; key1 = CATT(REPEAT('0',5-length(key)),key);output; 
run; 
0

ここでは私のために働いたものです。

data b (keep = str2); 
    format str2 $5. ; 
    set a; 
    catlength = 4 - length(str); 
    cat = repeat('0', catlength); 
    str2 = catt(cat, str); 
run; 

これは、既存の文字列の長さをカウントし、次に長さ4の猫の文字列を作成することによって動作する - すなわち、その後一緒に猫の値と元の文字列を付加します。

元の文字列が長さ5の場合、ネジが締め付けられることに注意してください。 また、入力文字列に$ 5がある場合は機能しません。それにフォーマット。

data a; /*input dataset*/ 
    input str $; 
    datalines; 
    a 
    aa 
    aaa 
    aaaa 
    aaaaa 
    ; 
run; 

data b (keep = str2); 
    format str2 $5. ; 
    set a; 
    catlength = 4 - length(str); 
    cat = repeat('0', catlength); 
    str2 = catt(cat, str); 
run; 

input: 
a 
aa 
aaa 
aaaa 
aaaaa 

output: 
0000a 
000aa 
00aaa 
0aaaa 
0aaaa 
0

私はこれを使用しますが、数値でのみ動作します。 INPUTの別の形式で試してください

data work.prueba; 
    format xx $5.; 
    xx='1234'; 
    vv=PUT(INPUT(xx,best5.),z5.); 
run; 
関連する問題