我正在从包含VARCHAR(5)密钥字段的数据库创建SAS数据集。
此字段包含一些使用全部5个字符的条目和一些使用较少字符的条目。
当我导入这些数据时,我宁愿填写所有较短的条目以使用所有五个字符。对于此示例,我想在左侧填充0
,字符为零。因此,114
将变为00114
,ABCD
将变为0ABCD
,EA222
将保持不变。
我尝试使用简单的数据语句,但当然以下方法不起作用:
data test;
set databaseinput;
format key $5.;
run;
我尝试使用用户定义的信息执行此操作,但我不认为可以在字符字段上按this SAS KB answer正确指定范围。另外,我很确定proc格式不会让我根据传入变量动态定义结果。
我确信这里有一个明显的解决方案,但我只是错过了它。
答案 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;