Publié le :
ETL CREATION_INTERNE

Implémentation et Comparaison de la Technique '_INFILE_' pour la Délimitation de Données

Ce code est également disponible en : Deutsch English Español
En attente de validation
Le script initialise un jeu de données ('HAVE') avec une variable caractère ('ROW') contenant une longue séquence de nombres délimités par des barres verticales. Ensuite, deux approches sont présentées : la première ('SPLIT') utilise une boucle et la fonction SCAN pour parser cette chaîne, une méthode jugée lente. La seconde ('SPLIT2') vise à implémenter la 'Infile Trick' en surchargeant le buffer _INFILE_ avec le contenu de la variable 'ROW', permettant une lecture rapide et efficace des éléments délimités directement dans un tableau de variables. Enfin, une PROC COMPARE est utilisée pour vérifier que les résultats des deux méthodes sont identiques, validant ainsi la performance accrue sans perte d'intégrité des données, sous réserve de la correction des erreurs de syntaxe dans 'SPLIT2'.
Analyse des données

Type : CREATION_INTERNE


Toutes les données sont générées en interne par le DATA step 'HAVE', qui crée une variable caractère longue ('ROW') contenant des valeurs délimitées. Aucun jeu de données externe n'est utilisé comme source primaire.

1 Bloc de code
DATA STEP Data
Explication :
Ce bloc DATA step crée un jeu de données nommé 'HAVE'. Il initialise une variable caractère 'ROW' de 8000 octets. Ensuite, il construit une chaîne de caractères complexe en concaténant 700 nombres formatés (z3.) séparés par le délimiteur '|'. Ce processus est répété 10 000 fois pour générer un grand nombre d'observations, simulant un jeu de données conséquent à traiter.
Copié !
1DATA 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;
10RUN;
2 Bloc de code
DATA STEP
Explication :
Ce DATA step lit le jeu de données 'HAVE'. Il déclare un tableau de 700 variables caractères ('VAR'). Une boucle est ensuite utilisée pour itérer sur ce tableau et extraire séquentiellement chaque élément de la variable 'ROW' en utilisant la fonction SCAN. Cette approche, bien que fonctionnelle, est notoirement lente pour de grandes quantités de données ou un grand nombre d'éléments à scanner, en raison de sa complexité algorithmique O(N^2).
Copié !
1DATA 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;
7RUN;
3 Bloc de code
DATA STEP
Explication :
Ce DATA step vise à implémenter la 'Infile Trick' pour une extraction rapide des données délimitées. Il lit le jeu de données 'HAVE'. L'instruction INFILE est configurée pour lire un fichier virtuel avec le délimiteur '|' et une longueur d'enregistrement élevée. La ligne cruciale `_infile_=ROW;` copie le contenu de la variable 'ROW' (du dataset 'HAVE') directement dans le buffer d'entrée du DATA step.
**NOTE SUR LA SYNTAXE :** Les instructions `input` suivantes contiennent des chemins de fichiers (`@code_sas_json/Mastering SAS Section7 (1).json` et `@code_sas_json/hsdua2304@gmail.com_SAS_Assignment_1.json`) qui sont syntaxiquement incorrects pour spécifier des variables ou des pointeurs de colonne dans un DATA step SAS. Pour être exécutable et fonctionnel, l'intention probable était de lire directement les valeurs délimitées dans un tableau de variables, par exemple `input (VAR1-VAR700) (:$10.);`. Tel qu'écrit, ce bloc SAS provoquera des erreurs de syntaxe et ne s'exécutera pas correctement.
Copié !
1DATA SPLIT2; /* Fast */
2 SET HAVE;
3 INFILE sasautos(verify.sas) dsd dlm='|' lrecl=8000;
4 INPUT @code_sas_json/Mastering SAS Section7 (1).json @;
5 _infile_=ROW;
6 INPUT @code_sas_json/Mastering SAS Section7 (1).json (VAR1-VAR700) (:$10.) @code_sas_json/hsdua2304@gmail.com_SAS_Assignment_1.json;
7RUN;
4 Bloc de code
PROC COMPARE
Explication :
Cette procédure compare les jeux de données 'SPLIT' (créé avec la méthode lente) et 'SPLIT2' (tentative d'utilisation de la 'Infile Trick') pour vérifier que les deux méthodes produisent des résultats identiques. Cela permet de valider l'exactitude de la technique d'optimisation malgré sa différence d'approche. En raison de l'erreur de syntaxe dans 'SPLIT2', cette PROC COMPARE échouera ou signalera des différences si 'SPLIT2' ne parvient pas à se construire correctement.
Copié !
1PROC COMPARE DATA=SPLIT compare=SPLIT2;
2RUN;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : SPDX-License-Identifier: Apache-2.0. Code original de ChrisNZ, discussion sur SAS Communities (https://communities.sas.com/t5/SAS-Programming/How-to-delimit-large-dataset-28-Million-rows-into-700-variables/m-p/487676).