Archivo de la etiqueta: trimn

Truco SAS. Tablas de una librería en una macro variable

Me plantean una duda, como crear un conjunto de datos con las tablas de una librería en sas y posteriormente generar una macro variable con ellos, esta es una entrada análoga a otra del blog pero sirve para recordar como funciona el ODS de SAS y el PROC DATASETS un procedimiento que no he usado habitualmente. Lo primero que vamos a hacer es observar que resultados arroja el PROC DATASETS en su sintaxis más sencilla, ver los contenidos de una librería:

 ods trace on;
proc datasets lib=datos;
quit;
ods trace off;

Recordamos que ODS (Output Delivery System) TRACE ON nos permite ver en la log de SAS los elementos que se obtienen como resultado, en este caso, el más sencillo, tenemos:

Output Added:
-------------
Name: Directory
Label: Directory Information
Template: Base.Datasets.Directory
Path: Datasets.Directory
-------------

Output Added:
-------------
Name: Members
Label: Library Members
Template: Base.Datasets.Members
Path: Datasets.Members
-------------

Evidentemente nos interesa Members para poner en una tabla SAS todos los miembros de la librería:

ods output Members=tablas;
proc datasets lib=datos ;
quit;

Ahora tenemos que meter en una macrovariable todos los elementos del campo name de la tabla SAS que hemos generado. Para ello en vez de emplear el habitual PROC SQL podemos usar una concatenación sobre los valores de name que diera como resultado final la macrovariable con la lista de las tablas: Sigue leyendo Truco SAS. Tablas de una librería en una macro variable

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.