Truco SAS. Limpiar un fichero de texto con SAS

El otro día me llegó al correo la siguiente cuestión acerca de caracteres extraños en un fichero de texto y la importación a SAS: Tengo un problema a la hora de importar a SAS un fichero txt. El caso es que tiene en algunos registros el carácter «flechita». Ejemplo: Calle Paseo de la Castellana «flechita» 60. Cuando lo importo como carácter para al llegar a la flechita. No se sí podrás ayudarme. Muchas gracias por adelantado. ...

4 de marzo de 2013 · rvaquerizo

Truco SAS. Ver el contenido de un formato

Para ver los valores que toma un formato con SAS tenemos que emplear el PROC FORMAT. La sintaxis es muy sencilla: proc format library = work.formats fmtlib; select &formato. run; Tenéis que poner el nombre del formato sin punto. Sintaxis sencilla, pero difícil de recordar (por lo menos a mi me ha pasado). Saludos.

6 de febrero de 2013 · rvaquerizo

Ayudadme. Importar a SAS texto con comillas

Hoy sois vosotros los que tenéis que ayudar al dinosaurio. Ya no estoy para estas cosas. Tengo un problema. Fichero de texto separado por ; típico csv de toda la vida. Este fichero de texto contiene diversos campos que a mis efectos son de texto. Si abrimos el fichero con una hoja de cálculo tendríamos: Pues bien, a la hora de importar unos datos con esa estructura desde SAS no soy capaz de que Dato2 siga conservando las comillas. Con IMPORT tampoco me funciona. El código sería algo parecido a esto: ...

17 de enero de 2013 · rvaquerizo

Macros SAS. Contar las palabras de una macro variable

Una macro de SAS interesante que nos permite ahorrar código. Dada una macro variable necesitamos contar el número de palabras que tiene esta macro variable. Para ello vamos a crear una función con código macro: ```sas %let texto = uno dos tres; %macro cuenta(mv); %eval(%sysfunc(length(%cmpres(&mv.),%str( ))) - %length(&mv.) + 1) %mend; %put La Macrovariable Texto tiene %cuenta(&texto.) palabras; Vemos que la macro variable texto tiene tres palabras y necesitamos contabilizarlas para automatizar un código. La propuesta que se plantea es el cálculo de la longitud de la macro sin espacios frente a la longitud de la macro variable con espacios. La diferencia más uno será el número de palabras de nuestro texto. Como aspectos interesantes tenéis el uso de %str( ) , %cmpres y como se juega con %sysfunc para evitar algún que otro problema. Esta macro tiene sus problemas, no pongáis más de dos espacios que la volvéis loca. Pero puede resultar muy útil para determinadas cosas. Saludos.

11 de diciembre de 2012 · rvaquerizo

Truco Excel. Dividir una variable cuantitativa en tramos

Un truco Excel que implica la utilización de la función JERARQUIA para la creación de un ranking y que la complementamos con la tramificación de ese ranking, de este modo creamos tramos de una variable numérica con Excel sin necesidad de ordenación previa. La situación sería: Tenemos un campo cuantitativo que deseamos tramificar. El primer paso es la fórmula JERARQUIA: =JERARQUIA(A1;A1:A30;1) Creamos un valor numérico que va desde el 1 hasta el 30 en función de la posición que ocupa, el último elemento de la función nos indica si es descendente (0) o si es ascendente (1). Ahora tenemos que dividir esos 30 valores en 4 grupos (por ejemplo) para ello hacemos una fórmula ya conocida para los lectores de esta bitácora: ...

20 de noviembre de 2012 · rvaquerizo

La macro iterlist para automatizar código SAS

Impresionante macro de SAS que nos puede ahorrar picar mucho mucho código SAS. La macro se llama iterlist y la he encontrado en este enlace. Es código SAS muy avanzado: %macro iterlist(code =,list =); %*** ASSIGN EACH ITEM IN THE LIST TO AN INDEXED MACRO VARIABLE &&ITEM&I ; %let i = 1; %do %while (%cmpres(%scan(&list., &i.)) ne ); %let item&i. = %cmpres(%scan(&list., &i.)); %let i = %eval((&i. + 1); %end; %*** STORE THE COUNT OF THE NUMBER OF ITEMS IN A MACRO VARIABLE: &CNTITEM; %let cntitem = %eval((&i. - 1); %*** EXPRESS CODE, REPLACING TOKENS WITH ELEMENTS OF THE LIST, IN SEQUENCE; %do i = 1 %to &cntitem.; %let codeprp = %qsysfunc(tranwrd(&code.,?,%nrstr(&&item&i..))); %unquote(&codeprp.) %end; %mend iterlist; El funcionamiento es muy complejo, destacaría el uso de `%qsysfunc`. El caso es que nos permite poner listas de código. Imaginemos que tenemos que hacer la siguiente tarea: ```sas data importes sasuser.importes; drop i j; array importe(10) ; do i=1 to 20000; do j=1 to 10; importe(j)=ranuni(8)*1000; end; grupo=ranpoi(4,5); output; end; run; proc summary data=importes nway; class grupo; output out = agr_grupo (drop=_type_ _freq_) mean(importe1)=media_importe1 mean(importe2)=media_importe2 ... mean(importe10)=media_importe10 sum(importe1)=suma_importe1 ... sum(importe10)=suma_importe10; quit; Necesitamos hacer un `proc summary` de 10 variables y de ellas vamos a calcular media y suma, tendremos que poner _sum_ y _mean_ por tantas variables como correspondan. Estamos repitiendo un código. Pues bien, esta macro nos permite repetir el código dada una lista, en este caso la lista se la pasamos como una macro: ```sas %let lista = importe1 importe2 importe3 importe4 importe5 importe6 importe7 importe8 importe9 importe10; proc summary data=importes nway; class grupo; output out = agr_grupo (drop=_type_ _freq_) %iterlist(list = &lista., code = %str( mean(?)=media_? )) %iterlist(list = &lista., code = %str( sum(?)=suma_? )); quit; Impresionante. Donde ponemos `?` la macro pone los elementos de la lista y en el parámetro code ponemos el código que se repite con `%str`. A este que escribe ahora mismo se le han caído los pantalones ante semejante genialidad. Impresionante.

17 de octubre de 2012 · rvaquerizo

Trucos Excel. Unir todos los excel en uno, versión muy mejorada

El amigo jose nos envía una nueva versión de la macro Excel que nos permite unir varios excel en uno. En este enlace en formato RAR tenéis un ejemplo de funcionamiento donde el libro de Excel más importante es UNIR.XLSM Las instrucciones de uso son: Ponemos todos los Excel que deseemos unir en un directorio Ponemos UNIR.XLSM en ese directorio Abrimos UNIR.XLSM y simplemente pulsamos el botón Tenemos un nuevo libro llamado UNIDOS.XLS Así de sencillo. El código que emplea la macro es visible, su autor no pone problemas. Muchas gracias jose por esta macro tan sencilla y tan práctica, seguro que muchos de vosotros la encontraréis muy útil. Yo la encuentro genial. Saludos.

25 de septiembre de 2012 · rvaquerizo

Macro SAS. Variables de un dataset en una macro variable

Hoy os presento una macro de SAS que nos permite recoger en una macro variable las variables de un conjunto de datos SAS. Tiene como particularidad que nos sirve para seleccionar aquellas variables que tienen un determinado patrón, del tipo consumo2010, consumo2011,… Es un código un poco más complejo de lo habitual pero tiene aspectos interesantes: options mlogic mprint; %macro lista_variables (ds= , nombre_mv= , patron=); *ES NECESARIO QUE LA MACROV FINAL SEA GLOBAL; %global &nombre_mv.; *PUEDE SER QUE LA LIBRERIA SEA WORK O PERMANENTE; data _null_; length lib tab $255.; if index("&ds.",".")=0 then lib="WORK"; else lib=scan("&ds.",1,".") ; put lib=; call symput('libreria',lib); tab=scan("&ds.",2,".") ; call symput('tabla',tab); run; *BUSCAMOS EN DICTIONARY DE SAS; proc sql noprint; select compress(name) into:&nombre_mv. separated by " " from sashelp.vcolumn where libname=upcase("&libreria.") and memname=upcase("&tabla.") and /*PODEMOS APLICAR UN PATRON*/ upcase(name) like '%'||"%upcase(&patron.)"||'%'; quit; %mend; El elemento principal de esta macro es una consulta a una de las tablas DICTIONARY de SAS. O mejor dicho, a una de las vistas que tenemos en SASHELP. Siempre he prefererido consultar las vistas de SASHELP. La vista consultada es VCOLUMN de donde extraemos la columna NAME y como condicionantes pasamos la librería en LIBNAME y el nombre de la tabla de la que deseamos obtener las variables en MEMNAME. Como particularidad podemos aplicar patrones. ...

6 de septiembre de 2012 · rvaquerizo

Macro (fácil) de SAS. Longitud de la parte decimal de un número

Muy sencillo, vemos el programa y posteriormente lo transformamos en una macro de SAS: ```sas data aleat; do i = 1 to 100; aleatorio=ranuni(8)*1000; largo_decimal = length(scan(put(aleatorio,best32.),2,".")); output; end; run; Sencillo, pasamos de número a carácter con PUT y buscamos el punto con SCAN, extraemos la segunda parte del carácter separado por punto y vemos su longitud. Esto pasado a una macro: ```sas %macro largo_decimal(num); length(scan(put(&num.,best32.),2,".")) %mend; data aleat; do i = 1 to 100; aleatorio=ranuni(8)*1000; largo_decimal = %largo_decimal(aleatorio); output; end; run; Sencillo, a mi hoy me ha sido útil. Saludos.

23 de agosto de 2012 · rvaquerizo

Truco SAS. Un vistazo a ficheros planos muy grandes

Alguna vez no habéis podido abrir un fichero de texto muy grande para comprobar si tiene cabeceras o conocer el separador de campos. Es habitual emplear para esto el gran UltraEdit. Pero podemos emplear el PROC FSLIST de SAS para poder hacer esta tarea y se nos abrirá de inmediato una vista del fichero en una ventana de nuestra sesión SAS. La sintaxis muy sencilla: ```sas proc fslist fileref="Z:\temp\archivo_enorme.txt"; quit; Este sencillo código nos abrirá las primeras líneas del archivo en un instante y así podremos comprobar si tiene cabeceras o el separador que utiliza. Esto nos facilitaría la importación del fichero a tabla SAS. Saludos.

20 de agosto de 2012 · rvaquerizo