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.

19 comentarios en “Trucos SAS. Eliminación de espacios en blanco

  1. Hola Raúl,

    Suelo entrar a tu blog para buscar trucos de SAS que me resultan muy útiles, así como las entradas sobre B.I. q publicas

    Hoy entro para hacerte una consulta profesional:

    Soy un profesional de T.I. que los últimos 10 años ha estado trabajando en diseño, desarrollo, implantación y soporte de sistemas Business Intelligence (SAS, Oracle, Microstrategy, Microsoft B.I), para diferentes sectores con foco en banca.
    Lo único que no he tocado o he tocado muy poco es data mining.

    Desde hace algún tiempo me planteo la posibilidad de dedicarme al B.I., pero desde el punto de vista de analista de negocio. Me refiero al típico perfil con conocimientos técnicos (BBDD, B.I.) y de negocio que modela, explota y analiza información en departamentos de marketing, comercial, inteligencia de clientes, etc…., es decir, B.I., pero desde la perspectiva de negocio.

    Creo que es este tu caso, me gustaría conocer tu experiencia, cómo es esa evolución, ya que me parece que este tipo de puestos tiene más contenido de negocio, pero me gustaría conocer experiencias, cómo es el día a día, si realmente se aprende de negocio, si son puestos con evolución, si es necesario mucha
    formación en negocio, data mining, etc…

    Gracias por adelantado Raul,

    Jorge Villar

  2. Hola,

    Tienes que tener buen conocimiento del sector bancario, sobre todo en sistemas informacionales y su explotación. Tu experiencia tiene que ayudarte en ese giro que quieres dar en tu profesión. Profesionalmente tiene más recorrido. El BI está ya muy maduro, incluso viejo, no sé si la nube o el NOSQL podrá darle nuevos aires. Pero la minería de datos no es tan bonita como se pone en los Power Point con flechas, ni es hablar de mariposas y apóstoles. El analista está entre las áreas de TI y esos departamentos puramente de negocio que mencionas, por eso es necesario tener conocimientos de los dos sectores. No tendrás problemas con las áreas de TI pero te consideran una molestia (lo siento) y por otro lado tienes al usuario final de tu trabajo, que no se cree que puedes ayudarle. Y aquí la línea entre el que realiza consultas y el que crea herramientas que ayuden a la toma de decisiones es muy fina.

    Ahora, desde mi punto de vista, quieres dar un paso lógico. Yo te animo a que lo des. Y aquí un consejo, el software es sólo una herramienta, al final lo que importa es que los números nos ayuden a entender el negocio.

    Saludos.

  3. Hola Raul,

    En TI la evolución que tengo es en gestión de proyectos, pero tampoco me veo toda la vida en gestión en consultoría, de ahí que me plantee el cambio. A nivel puramente técnico de desarrollo cualquier día lo hacen todo los indios..

    Estar entre las áreas de TI y usuario final ya lo he hecho alguna vez y conozco los inconvenientes. Donde no sé si me quedo corto, es en temas de data mining (quizás tú me puedas orientar aquí en lo q puedo necesitar), he hecho muchos temas de modelización BBDD, diseño e implementación capa reporting, diseño procesos ETL, pero casi nada de minería.

    Por ejemplo, llevado a SAS, he utilizado SAS/BASE, SAS/WA, SAS/DI, SAS/EG, pero para temas ETL o de extracción de datos. En minería poco más allá de una regresión lineal o distribuciones sencillas. Eso si, técnicamente por ejemplo SAS/BASE muy dominado y la parte de BBDD (diseño, creación, etc..), también.

    Lógicamente tengo que obtener más conocimiento de negocio, pero esa es ya mi pelea día a día. Estoy muy acostumbrado a hablar con negocio y proponerle soluciones.

    Muchas gracias por tus consejos.

    Jorge,

  4. Hola,

    Posiblemente no es el mejor lugar y por ello te pido de antemano disculpas. Mi duda es la siguiente, ¿sabes cómo hacer que SAS lea la información de pantallas de un Host Cobol/
    Cics/DB2?

    La idea sería imitar el comportamiento de un humano: tener un dataset con información por ejemplo de número de matrícula de vehículos; SAS debería ingresar esa información en una pantalla de un servidor Host en cobol que al dar al intro se actualiza y ofrece más información (color, cilindrada, modelo del vehículo); SAS debe leer esa información extra y devolverla junto a su matrícula en un dataset.

    Gracias
    Un saludo

  5. Iván,

    No te entendido muy bien. Pero creo que quieres recorrer una tabla SAS que meta datos en un terminal Host y recoger el resultado de la lectura del terminal y llevarlo a otra tabla SAS.

    No se me ocurre como hacerlo, imagino que no tienes SAS en Host (si no harías el cruce). ¿Puedes hacer algo vía macros en el terminal? La idea sería meter en el clipboard una observación de SAS que se pasara al terminal host y después seleccionar toda la pantalla, copiarla y llevarlo a SAS.

    No es sencillo lo que pides.

  6. Hola Raúl,

    Rizando el rizo de tu entrada sobre eliminar espacios en blanco, te propongo un problema similar: ¿cómo eliminar “saltos de carro” de una variable?

    Lo ilustro un poco más con un ejemplo. Supongamos un fichero de texto delimitado, con ‘;’ como separador por ejemplo. Una de las variables es un comentario que contiene largas cadenas de texto. Esas cadenas de texto pueden contener múltiples líneas. Se trata de conseguir leer el fichero sin interpretar los saltos de linea como paso a una nueva variable.

    Supongo que en tus muchas peripecias con SAS ya te has enfrentado antes a este perro. Yo lo he intentado con infile y scanover, pero no he conseguido afinarlo del todo. ¿Algún truco en la chistera?

  7. Gustavo, ese problema que planteas es muy típico cuando mueves archivos de texto entre unix y windows. Tengo que hacer una entrada al respecto, pero se solucionaría así:

    data _null_;
    length char $1.;
    infile “C:\temp\Raul\informes\&&datos..txt” lrecl=1 recfm=F missover dsd;
    file “C:\temp\Raul\informes\&&datos2..txt” lrecl=1 recfm=F;
    input char $ASCII.;
    if byte(char) = 13 then char = rank(10);/*LINEA A VARIAR*/
    put char;
    run;

    Se trata de leer caracter a caracter como ascii y transformar el caracter ascii 13 (retonrno de carro en unix) a carcater ascii 10. Importante: no recuerdo si es de 13 a 10 de 10 a 13 o ambos números están equivocados.

  8. Hola Raúl:

    Mil gracias por tu magnifico blog.
    Puede que sea poco sofisticado, pero estoy tratando de duplicar la siguiente fórmula de excel =DERECHA(A3;LARGO(A3)-HALLAR(“-“;A3)) en SAS Guide, pero nada que consigo las funciones adecuadas en SAS. Por otro lado, existe alguna función que me permita encontrar, por ejemplo que me extraía los datos a partir del carácter numérico que encuentre?.

    Mil gracias.

    Saludos,

    Espe

  9. Hola esperanza. Por lo que veo quieres extraer un número de posiciones hasta el guión. Con SAS encuentras el guión con INDEX. Algo así: substr(variable,1,index(variable,”-“))

    Saludos.

  10. Hola Raul, necesito saber cual es la funcion en sas que realiza lo que la funcion de excel “Encontrar” hace, es decir en un texto con algunos caracteres especificos en que posicion se encuentra al que iguale es decir tengo este listado 00112222 y si quiero encontrar en que posicion esta por primera vez el caracter 1 (Para el ejemplo 3)

  11. Hola Raul,
    Agradezco por este magnifico blog.
    Tengo un inconveniente y estoy buscando urgentemente la solución.. tengo un vector de unos y ceros (100001100010101), no todos tienen la misma dimensión. Necesito eliminar el último valor del vector, no lo he podido realizar.. Por favor, una super ayuda!! ^_^

  12. data uno;
    input num $30.;
    datalines;
    100001100010101
    1000011000101011111110
    1111111110
    0000000001
    ;
    run;

    data uno;
    set uno;
    primera = reverse(substr(compress(reverse(num)),2,length(num)-1));
    run;

    Lo tratas como una variable de caracteres. La das la vuelta, eliminas el primer elemento y la vuelves a dar la vuelta. Saludos.

  13. Hola que talm, deseo una function en SAS que me reemplace los espacios de una cadena de caracteres alfanumericos en cero como lo hago?

  14. Hola, me gustaría saber si existe alguna función en sas que me permita introducir ceros a la izquierda de un valor numérico.
    Gracias

  15. El formato numérico Z5. pondría todos los números con el formato 00000 y si lo quieres transformar a caracter pondrías put(variable,z5.) Si tienes una cadena de texto y no un número tienes que añadir por la izquierda tantos ceros como te haga falta.

    Voy a hacer un truco SAS con tu cuestión. Saludos.

  16. Necesito quitar duplicado en una tabla de SAS, y quedarme con el que tenga la ultima fecha de modificación o que tengan estado COMPLETADO O CANCELADO.
    Campos: nro de orden.(que es lo que se repite en mi archivo ya que se registran todos los estados que ha pasado). Podrías ayudarme please?, gracias!!!!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

[bws_google_captcha]