El script inicializa un conjunto de datos ('HAVE') con una variable de tipo carácter ('ROW') que contiene una larga secuencia de números delimitados por barras verticales. Luego, se presentan dos enfoques: el primero ('SPLIT') utiliza un bucle y la función SCAN para analizar esta cadena, un método considerado lento. El segundo ('SPLIT2') busca implementar el 'Infile Trick' sobrecargando el búfer _INFILE_ con el contenido de la variable 'ROW', permitiendo una lectura rápida y eficiente de los elementos delimitados directamente en un array de variables. Finalmente, se utiliza un PROC COMPARE para verificar que los resultados de ambos métodos son idénticos, validando así el aumento del rendimiento sin pérdida de integridad de los datos, sujeto a la corrección de errores de sintaxis en 'SPLIT2'.
Análisis de datos
Type : CREACIÓN_INTERNA
Todos los datos se generan internamente mediante el DATA step 'HAVE', que crea una variable de tipo carácter larga ('ROW') que contiene valores delimitados. No se utiliza ningún conjunto de datos externo como fuente primaria.
1 Bloque de código
DATA STEP Data
Explicación : Este bloque DATA step crea un conjunto de datos llamado 'HAVE'. Inicializa una variable de tipo carácter 'ROW' de 8000 bytes. Luego, construye una cadena de caracteres compleja concatenando 700 números formateados (z3.) separados por el delimitador '|'. Este proceso se repite 10,000 veces para generar un gran número de observaciones, simulando un conjunto de datos consecuente a procesar.
¡Copiado!
data HAVE;\n length ROW $8000;\n ROW='|||';\n do I=1 to 700;\n ROW=catx('|',ROW,put(i,z3.));\n end;\n do J = 1 to 1e4;\n output;\n end;\nrun;
1
DATA HAVE;
2
LENGTH ROW $8000;
3
ROW='|||';
4
DO I=1 to 700;
5
ROW=catx('|',ROW,put(i,z3.));
6
END;
7
DO J = 1 to 1e4;
8
OUTPUT;
9
END;
10
RUN;
2 Bloque de código
DATA STEP
Explicación : Este DATA step lee el conjunto de datos 'HAVE'. Declara un array de 700 variables de tipo carácter ('VAR'). Luego se utiliza un bucle para iterar sobre este array y extraer secuencialmente cada elemento de la variable 'ROW' utilizando la función SCAN. Este enfoque, aunque funcional, es notoriamente lento para grandes cantidades de datos o un gran número de elementos a escanear, debido a su complejidad algorítmica O(N^2).
¡Copiado!
data SPLIT; /* Slow */\n set HAVE;\n array VAR(700) $10;\n do I = 1 to dim(VAR);\n VAR[I]=scan(ROW,I,'|','m');\n end;\nrun;
1
DATA SPLIT; /* Slow */
2
SET HAVE;
3
array VAR(700) $10;
4
DO I = 1 to dim(VAR);
5
VAR[I]=scan(ROW,I,'|','m');
6
END;
7
RUN;
3 Bloque de código
DATA STEP
Explicación : Este DATA step tiene como objetivo implementar el 'Infile Trick' para una extracción rápida de datos delimitados. Lee el conjunto de datos 'HAVE'. La instrucción INFILE se configura para leer un archivo virtual con el delimitador '|' y una longitud de registro alta. La línea crucial `_infile_=ROW;` copia el contenido de la variable 'ROW' (del dataset 'HAVE') directamente en el búfer de entrada del DATA step.\n**NOTA SOBRE LA SINTAXIS:** Las siguientes instrucciones `input` contienen rutas de archivo (` @code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json` y ` @code_sas_json/hsdua2304@gmail.com_SAS_Assignment_1.json`) que son sintácticamente incorrectas para especificar variables o punteros de columna en un DATA step SAS. Para ser ejecutable y funcional, la intención probable era leer directamente los valores delimitados en un array de variables, por ejemplo `input (VAR1-VAR700) (:$10.);`. Tal como está escrito, este bloque SAS causará errores de sintaxis y no se ejecutará correctamente.
¡Copiado!
data SPLIT2; /* Fast */\n set HAVE;\n infile sasautos(verify.sas) dsd dlm='|' lrecl=8000;\n input @code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json @;\n _infile_=ROW;\n input @code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json (VAR1-VAR700) (:$10.) @code_sas_json/hsdua2304@gmail.com_SAS_Assignment_1.json;\nrun;
INPUT @code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json @;
5
_infile_=ROW;
6
INPUT @code_sas_json/Mastering SAS Section3.json SAS Section7 (1).json (VAR1-VAR700) (:$10.) @code_sas_json/hsdua2304@gmail.com_SAS_Assignment_1.json;
7
RUN;
4 Bloque de código
PROC COMPARE
Explicación : Este procedimiento compara los conjuntos de datos 'SPLIT' (creado con el método lento) y 'SPLIT2' (intento de uso del 'Infile Trick') para verificar que ambos métodos producen resultados idénticos. Esto permite validar la exactitud de la técnica de optimización a pesar de su diferencia de enfoque. Debido al error de sintaxis en 'SPLIT2', este PROC COMPARE fallará o reportará diferencias si 'SPLIT2' no se construye correctamente.
¡Copiado!
proc compare data=SPLIT compare=SPLIT2; \nrun;
1
PROC COMPAREDATA=SPLIT compare=SPLIT2;
2
RUN;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
Información de copyright : SPDX-License-Identifier: Apache-2.0. Código original de ChrisNZ, discusión en SAS Communities (https://communities.sas.com/t5/SAS-Programming/How-to-delimit-large-dataset-28-Million-rows-into-700-variables/m-p/487676).
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.