2011-11-07 211 views
7

Estoy creando un conjunto de datos SAS a partir de una base de datos que incluye un campo clave VARCHAR (5).¿Cómo rellenar los campos de caracteres en SAS?

Este campo incluye algunas entradas que usan los 5 caracteres y algunas que usan menos.

Cuando importo estos datos, prefiero rellenar todas las entradas más cortas para usar los cinco caracteres. Para este ejemplo, quiero rellenar a la izquierda con 0, el carácter cero. Entonces, 114 se convertiría en 00114, ABCD se convertiría en 0ABCD, y EA222 se mantendría como está.

He intentado esto con una declaración de datos simple, pero por supuesto el siguiente no funciona:

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

He tratado de hacer esto con un inf definida por el usuario, pero no lo hago Creo que es posible especificar los rangos correctamente en los campos de caracteres, por this SAS KB answer. Además, estoy bastante seguro de que el formato de proc no me permitirá definir el resultado dinámicamente en términos de la variable entrante.

Estoy seguro de que hay una solución obvia aquí, pero me la estoy perdiendo.

+0

¿Cómo desea lidiar con 'ABC'? ¿Debería ser '00ABC'? – itzy

+0

Sí, '00ABC' es correcto en mi caso. Además, buen punto sobre el uso de etiquetas de código. Publicación original actualizada. –

+0

¿Pueden las entradas contener espacios? Por ejemplo 'AB_C' o incluso' _AB_' (donde el guión bajo representa un espacio)? –

Respuesta

6

Aquí es una alternativa:

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

Estoy seguro de que alguien tendrá una solución más elegante, pero el siguiente código funciona. Básicamente está rellenando la variable con cinco ceros a la izquierda, invirtiendo el orden de esta cadena de texto para que los ceros estén a la derecha, invirtiendo esta cadena de texto nuevamente y limitando el tamaño a cinco caracteres, en el orden original pero con el margen izquierdo con ceros.

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

Me llevó mucho tiempo para poder validar esta respuesta, pero es perfecta para mi problema. –

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

Esto es lo que funcionó para mí.

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

fin se cuenta la longitud de la cadena existente, y luego la creación de una cadena de gato de longitud 4 - eso, y luego añadiendo el valor de gato y la cadena original juntos.

Observe que se estropea si la cadena original tiene una longitud de 5. Además, no funcionará si la cadena de entrada tiene un valor de $ 5. formato en él.

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

Utilizo esto, pero solo funciona con valores numéricos: S. Pruebe con otros formatos en la ENTRADA

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