vuelos software military fly españa check airline sas

software - sas vuelos



El conjunto de datos sas falla cuando una entrada está vacía (3)

Tengo un código SAS donde utilizo un comando de conjunto de datos para combinar 3 archivos. Esta semana, tuvimos algunas instancias donde uno de los archivos de entrada tenía cero filas. Esto causó que el archivo no se formatee correctamente (todas las columnas eran numéricas) y, por lo tanto, el paso de datos falló? ¿Hay alguna manera de anular el requisito de que los formatos de columna deben ser consistentes si una entrada tiene cero filas?

data combined_file; set file1 file2 file3; run;


Estoy de acuerdo con Quentin en el problema, pero tengo una solución ligeramente diferente.

En lugar de tener una macro contenedora alrededor de algunas sentencias %if , escriba una macro para las filas establecidas.

%macro checkAny(ds=); %if %anyobs(&ds) %then &ds. ; %mend checkAny; data want; set %checkAny(ds=file1) %checkAny(ds=file2) %checkAny(ds=file3) ; run;

Por supuesto, con una macro %anyobs también como notas de Quentin.

También puede cambiar esto a, en lugar de buscar observaciones, verificar que las columnas sean las mismas. Si tiene un patrón de columna particular, puede escribir una macro para verificar dictionary.columns y verificar que todos sean iguales.


No, no creo que puedas ignorar este comportamiento.

Cuando establece conjuntos de datos juntos, SAS arrojará un error si hay una variable que es numérica en un conjunto de datos y carácter en el otro. Este error se genera en tiempo de compilación, antes de que se hayan procesado los registros.

Estoy de acuerdo con @Tom, lo mejor que puede hacer es solucionar el problema raíz de por qué el conjunto de datos se está creando con todos los valores numéricos.

Si desea una solución, considere usar el lenguaje de macros para verificar si un conjunto de datos está vacío o no. Usted terminaría una macro que genera condicionalmente la lista de conjuntos de datos para incluir en la declaración SET, por ejemplo:

%macro ...; data combined_file; set %if %anyobs(file1) %then file1 ; %if %anyobs(file2) %then file2 ; %if %anyobs(file3) %then file3 ; ; run; %mend;

Si quiere probar esa solución alternativa y quiere ayuda para escribir% anyobs, solo deje caer un comentario y publicaré el que uso. Está basado en% MTANYOBS de Jack Hamilton, como se describe en este documento: http://www2.sas.com/proceedings/sugi26/p095-26.pdf .


Si el problema está en los tipos del mismo nombre de variable en los conjuntos de datos, ¿por qué no verificarlo directamente?

PROC CONTENTS DATA=file1 OUT=var1 NOPRINT ; RUN ; PROC CONTENTS DATA=file2 OUT=var2 NOPRINT ; RUN ; PROC CONTENTS DATA=file3 OUT=var3 NOPRINT ; RUN ; PROC SQL ; SELECT COUNT(*) INTO :bad12 FROM var1 v1 INNER JOIN var2 v2 ON UPCASE(v1.name) EQ UPCASE(v2.name) WHERE v1.type NE v2.type ; SELECT COUNT(*) INTO :bad13 FROM var1 v1 INNER JOIN var3 v3 ON UPCASE(v1.name) EQ UPCASE(v3.name) WHERE v1.type NE v3.type ; SELECT COUNT(*) INTO :bad23 FROM var2 v2 INNER JOIN var3 v3 ON UPCASE(v2.name) EQ UPCASE(v3.name) WHERE v2.type NE v3.type ; QUIT ;

En este punto, puede verificar si el ecualizador de & bad12 + & bad13 + & bad23 es 0. Si es así, proceda. Si no, sal.