Archivo de la etiqueta: compress

Espacios en SAS

 

Las funciones SAS más habituales para eliminar blancos son las que tenéis en la figura de arriba. Para llegar a ese conjunto de datos SAS hemos ejecutado el siguiente paso data:

 data ejemplo;

st = "  Cuando  brilla   el sol    ";
l_st=length(st); output;

funcion="COMPRESS     "; st1 = compress(st); 
l_st1=length(st1); output;

funcion="COMPBL";  st1 = compbl(st); 
l_st1=length(st1); output;

funcion="TRIM";    st1 = trim(st); 
l_st1=length(st1); output;

funcion="TRIMN";   st1 = trimn(st); 
l_st1=length(st1); output;

funcion="STRIP";    st1 = strip(st); 
l_st1=length(st1); output;

funcion="SRTIP+COMBBL"; st1 = strip(compbl(st)); 
l_st1=length(st1); output;

run;

Distintas formas de eliminar espacios dentro de una cadena de caracteres en SAS. Partimos de la variable string " Cuando brilla el sol " y empleamos las siguientes funciones:

  • COMPRESS: Elimina todos los espacios en blanco de la variable
  • COMPBL: Elimina aquellos espacios en blanco que considera innecesarios, ejemplo '  ' -> ' '
  • TRIM y TRIMN: En este caso no hacen nada, así lo recordamos
  • STRIP: Elmina los espacios en blanco innecesarios por la izquierda
  • STRIP + COMPL: Es un combo de funciones pero el mejor para nuestro caso

Espero que entendáis mejor estas funciones. En breve veremos porque existen TRIM y TRIMN. Saludos.

Trucos SAS. Eliminación de espacios en blanco

Truco SAS práctico para aquellos que os estáis iniciando en el uso de las funciones de texto con SAS. Se trata de eliminar aquellos espacios en blanco que no son necesarios en una variable. Quería plantearos las posibles soluciones que se me han ido ocurriendo. Algunas de ellas no son eficientes pero es necesario que dispongáis de todas. En la línea habitual planteo un ejemplo para que lo ejecutéis y así podáis analizar los resultados:

data ejemplo;
palabra=" EJEMPLO DE ELIMINACIÓN DE BLANCOS CON SAS ";
uso_compress=compress(palabra);
uso_trimn=trimn(palabra);
uso_trimn_left=trimn(left(palabra));
uso_compbl=compbl(palabra);
length uso_rxchange $50.;
rx=rxparse("' ' to ' '"); drop rx;
call rxchange (rx,length(palabra),palabra,uso_rxchange);
run;

La variable palabra tiene tanto espacios por la derecha como por la izquierda y entre las palabras que no son necesarios. La función COMPRESS elimina todos los espacios en blanco. Con TRIMN y LEFT eliminamos los espacios en blanco al inicio y al final de palabra pero mantenemos los espacios en blanco entre palabras.
COMPBL (compress blank) parece más adecuada para eliminar los espacios en blanco sobrantes entre las palabras. La función de reconocimiento de patrones RXCHANGE (que necesita el patrón previamente con RXPARSE) sustituye dos espacios por uno sólo, el resultado no parece muy satisfactorio; esto mismo podríamos hacerlo con la función TRANWRD. A ver si algún lector encuentra un patrón adecuado para
estas funciones. 

¿La combinación óptima de funciones?

data ejemplo;
palabra=" EJEMPLO DE ELIMINACIÓN DE BLANCOS CON SAS ";
optimo=trimn(left(compbl(palabra)));
run;

Combinación de 3 funciones de texto que nos permite eliminar espacios en blanco. A continuación lo ponemos como una macro que realiza una función:

%macro noblanco(pal);
trimn(left(compbl(&pal.)))
%mend;
*;
data ejemplo;
palabra=" EJEMPLO DE ELIMINACIÓN DE BLANCOS CON SAS ";
optimo=%noblanco(palabra);
run;

Espero que sea de vuestra utilidad. Un saludo.

Macros SAS. Limpiar una cadena de caracteres

Macro de SAS que he utilizado hoy para limpiar caracteres en una cadena de texto. Está muy limitada y es muy sencilla pero puede serviros:


%macro valida(in,out);
length escribe $55.;
escribe="";
do i=1 to length(&in.);
  j=substr(&in.,i,1);
 if j in ('A','B','C','D','E','F','G','H','I','J','K',
 'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','Ñ') then escribe=trim(escribe)||j;
 else if substr(&in.,i,1)=" " then escribe=trim(escribe)||"-";
 else escribe=trim(escribe);
 drop i j escribe;
end;
&out.=tranwrd(compress(escribe),"-"," ");
%mend;

Es bastante mala y limitada, insisto. Si alguien aporta algo se agradecerá. El tema es que recorre una variable alfanumérica carácter a carácter y si no es una letra mayúscula se lo chimpunea sin ningún miramiento, aporta un poco más de talento cuando aparece un espacio en blanco. Ahí va el ejemplo de uso:


data _null_;
y="ME.N9UDA@ CAGA--;DA vENIR";
%valida(upcase(y),x);
put x=;
run;

En fin, si la voy mejorando lo sigo comunicando. Por cierto, esto se puede hacer con WPS a la perfección. Si alguno de vosotros está interesado en WPS o tiene ya jornada de verano y necesitan consultoría que me escriba a rvaquerizo@analisisydecision.es

Macros SAS. Calular la longitud de un número.

Ha llegado hoy una búsqueda que no ha permanecido en AyD ni 20 segundos. Quería calcular la longitud de un número con SAS. Como yo estoy aquí para compartir mis conocimientos y hay una persona que los necesita aquí está esta macro que espero o sea de utilidad:


%macro largo(num);
length(compress(put(&num.,32.)))
%mend;

Esta macro recibe un parámetro que ha de ser un número y lo que hace es transformarlo a carácter comprimido y calcular su longitud. Veamos ejemplos de uso:


data uno;
input x;
datalines;
1234
12345
123456
1234567
12345678
1
12
123456789
1234567890
;
run;


data uno;
set uno;
y=%largo(x);
*NOS QUEDAMOS CON LA PRIMERA CIFRA;
z=int(x/(10**(%largo(x)-1)));
run;
proc print;
run;

Con este ejemplo vemos perfectamente su funcionamiento, además puede ir en operaciones matemáticas como el ejemplo en el que se queda con la primera cifra de un número. Espero que sea de utilidad y como siempre si tenéis dudas, sugerencias o un trabajo con un horario inferior o igual a 40 horas semanales reales podéis contactar conmigo en rvaquerizo@analisisydecision.es