如何在SAS中填充字符字段?

时间:2011-11-07 16:15:24

标签: sas

我正在从包含VARCHAR(5)密钥字段的数据库创建SAS数据集。

此字段包含一些使用全部5个字符的条目和一些使用较少字符的条目。

当我导入这些数据时,我宁愿填写所有较短的条目以使用所有五个字符。对于此示例,我想在左侧填充0,字符为零。因此,114将变为00114ABCD将变为0ABCDEA222将保持不变。

我尝试使用简单的数据语句,但当然以下方法不起作用:

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

我尝试使用用户定义的信息执行此操作,但我不认为可以在字符字段上按this SAS KB answer正确指定范围。另外,我很确定proc格式不会让我根据传入变量动态定义结果。

我确信这里有一个明显的解决方案,但我只是错过了它。

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;

答案 2 :(得分:2)

我确定有人会有更优雅的解决方案,但以下代码可以使用。基本上它是用五个前导零填充变量,然后反转此文本字符串的顺序,使零到右边,然后再次反转此文本字符串并将大小限制为五个字符,按原始顺序但左边填充用零。

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;

答案 3 :(得分:0)

这对我有用。

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

它的工作原理是计算现有字符串的长度,然后创建一个长度为4的cat字符串 - 然后将cat值和原始字符串附加在一起。

请注意,如果原始字符串的长度为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   

答案 4 :(得分:0)

我使用它,但仅适用于数值:S。尝试使用INPUT中的其他格式

data work.prueba;
    format xx $5.;
    xx='1234';
    vv=PUT(INPUT(xx,best5.),z5.);
run;