Publié le :
Accès aux données CREATION_INTERNE

Lecture et écriture de fichiers externes

Ce code est également disponible en : Deutsch Español
En attente de validation
L'analyse fonctionnelle détaille l'utilisation des instructions DATA Step telles que INFILE et INPUT pour lire les fichiers externes, ainsi que l'instruction FILE et PUT pour écrire des données. Le concept de fileref est introduit comme méthode de référencement indirect pour une meilleure flexibilité et maintenabilité du code. Des exemples d'utilisation de filerefs avec des emplacements de stockage agrégés (répertoires) et diverses méthodes d'accès (DATAURL, FTP, Hadoop, SOCKET, URL, WebDAV, ZIP) sont présentés. Enfin, la lecture de données binaires à l'aide d'informats SAS© spécifiques est expliquée, en soulignant l'importance de la conversion des octets et des options RECFM et LRECL pour les données binaires par colonne.
Analyse des données

Type : CREATION_INTERNE


Les exemples utilisent des données générées (datalines) ou des fichiers temporaires créés par l'agent. Les données SASHELP sont utilisées lorsque c'est approprié pour les procédures d'exportation/impression.

1 Bloc de code
DATA STEP Data
Explication :
Cet exemple utilise l'instruction `INFILE` pour spécifier un fichier externe (`/tmp/input-file.txt`) comme source de données. L'instruction `INPUT` lit les données dans les variables `PatientID`, `Week1`, `Week8` et `Week16`. Une nouvelle variable `loss` est calculée, puis la procédure `PRINT` affiche le contenu du jeu de données `weight`.
Copié !
1/* Création d'un fichier d'entrée factice */
2filename mydata_example1 "/tmp/input-file.txt";
3DATA _null_;
4 file mydata_example1;
5 put "101 70 68 65";
6 put "102 80 78 75";
7 put "103 90 88 85";
8RUN;
9 
10DATA weight;
11 INFILE mydata_example1;
12 INPUT PatientID $ Week1 Week8 Week16;
13 loss=Week1-Week16;
14RUN;
15 
16PROC PRINT DATA=weight;
17RUN;
2 Bloc de code
DATA STEP Data
Explication :
Cet exemple montre comment spécifier directement le chemin physique complet d'un fichier externe dans l'instruction `INFILE`. SAS lit les données de ce fichier pour créer le jeu de données `weight_direct`.
Copié !
1/* Création d'un fichier d'entrée factice */
2filename temp_input_direct "/tmp/direct_input.txt";
3DATA _null_;
4 file temp_input_direct;
5 put "A01 70 65";
6 put "B02 80 72";
7 put "C03 90 83";
8RUN;
9 
10DATA weight_direct;
11 INFILE '/tmp/direct_input.txt'; /* Chemin direct vers le fichier */
12 INPUT idno $ week1 week16;
13 loss=week1-week16;
14RUN;
15 
16PROC PRINT DATA=weight_direct;
17RUN;
3 Bloc de code
DATA STEP Data
Explication :
Cet exemple illustre l'écriture de données dans un fichier externe en spécifiant directement son chemin physique dans l'instruction `FILE`. Les instructions `PUT` écrivent des informations conditionnelles basées sur la variable `loss` dans le fichier `/tmp/output_status.txt`.
Copié !
1/* Création de données factices pour calculer 'loss' */
2filename temp_input_for_status "/tmp/direct_input_for_status.txt";
3DATA _null_;
4 file temp_input_for_status;
5 put "A01 70 65"; /* loss = 5 */
6 put "B02 80 70"; /* loss = 10 */
7 put "C03 90 70"; /* loss = 20 */
8RUN;
9 
10DATA weight_for_status;
11 INFILE temp_input_for_status;
12 INPUT idno $ week1 week16;
13 loss=Week1-Week16;
14RUN;
15 
16/* Écriture du statut dans un fichier externe */
17filename temp_output_status "/tmp/output_status.txt";
18DATA _null_;
19 SET weight_for_status;
20 file temp_output_status; /* Chemin direct vers le fichier de sortie */
21 IF loss ge 5 and loss le 9 THEN
22 put idno loss 'AWARD STATUS=3';
23 ELSE IF loss ge 10 and loss le 14 THEN
24 put idno loss 'AWARD STATUS=2';
25 ELSE IF loss ge 15 THEN
26 put idno loss 'AWARD STATUS=1';
27RUN;
28 
29/* Affichage du contenu du fichier de sortie */
30%inc "/tmp/output_status.txt";
4 Bloc de code
%INCLUDE Data
Explication :
La macro-instruction `%INCLUDE` est utilisée pour insérer et exécuter le contenu d'un fichier externe (`/tmp/source_program.sas`) directement dans le flux du programme SAS. Cela permet de modulariser le code ou d'exécuter des scripts préexistants.
Copié !
1/* Création d'un fichier source factice avec des instructions SAS */
2filename source_pgm_include "/tmp/source_program.sas";
3DATA _null_;
4 file source_pgm_include;
5 put "data example; x=1; y=2; run;";
6 put "proc print data=example; run;";
7RUN;
8 
9%include '/tmp/source_program.sas'; /* Inclusion directe du fichier */
5 Bloc de code
FILENAME, DATA STEP Data
Explication :
L'instruction `FILENAME` assigne un nom court (fileref `mydata`) à un fichier externe. Ce fileref est ensuite utilisé dans l'instruction `INFILE` pour lire les données, offrant une abstraction du chemin physique du fichier.
Copié !
1/* Création d'un fichier d'entrée factice */
2filename mydata_ref_input "/tmp/ref_input.txt";
3DATA _null_;
4 file mydata_ref_input;
5 put "ID001 50 45";
6 put "ID002 60 55";
7RUN;
8 
9/* Assignation d'un fileref au fichier */
10filename mydata "/tmp/ref_input.txt";
11DATA weight_ref;
12 INFILE mydata; /* Utilisation du fileref */
13 INPUT idno $ week1 week16;
14 loss=week1-week16;
15RUN;
16PROC PRINT DATA=weight_ref; RUN;
6 Bloc de code
FILENAME, PROC IMPORT Data
Explication :
Un fileref (`mydata`) est attribué à un fichier délimité. `PROC IMPORT` utilise ce fileref pour importer les données dans un jeu de données SAS nommé `shoes`, en spécifiant le délimiteur et l'inclusion des noms de colonnes.
Copié !
1/* Création d d'un fichier d'entrée délimité factice */
2filename mydata_ref_import "/tmp/ref_import.txt";
3DATA _null_;
4 file mydata_ref_import;
5 put "Brand,Size,Color";
6 put "Nike,10,Black";
7 put "Adidas,9,White";
8RUN;
9 
10/* Assignation d'un fileref au fichier */
11filename mydata "/tmp/ref_import.txt";
12PROC IMPORT datafile=mydata /* Utilisation du fileref */
13 out=shoes dbms=dlm replace;
14 delimiter=',';
15 getnames=YES;
16RUN;
17PROC PRINT DATA=shoes; RUN;
7 Bloc de code
FILENAME, DATA STEP Data
Explication :
Après avoir calculé la variable `loss` à partir de données temporaires, un fileref (`myreport_output`) est assigné à un fichier de sortie. L'instruction `FILE` dans une étape DATA `_null_` utilise ensuite ce fileref pour écrire les résultats dans le fichier spécifié.
Copié !
1/* Création de données d'entrée factices pour générer 'loss' */
2DATA temp_input_for_report;
3 INPUT idno $ week1 week16;
4 CARDS;
5ID1 100 90
6ID2 80 75
7 ;
8RUN;
9 
10/* Calcul de 'loss' et écriture dans un fichier externe via fileref */
11filename myreport_output "/tmp/my_report.txt";
12DATA _null_;
13 SET temp_input_for_report;
14 file myreport_output; /* Utilisation du fileref pour la sortie */
15 loss = week1 - week16;
16 put idno "Loss=" loss;
17RUN;
18 
19/* Affichage du contenu du fichier de sortie */
20%inc "/tmp/my_report.txt";
8 Bloc de code
FILENAME, PROC EXPORT
Explication :
Cet exemple utilise `PROC EXPORT` pour exporter le jeu de données `SASHELP.SHOES` vers un fichier externe (`/tmp/exported_shoes.txt`) dont le nom est défini par le fileref `myreport_export`. Les données sont exportées en tant que données délimitées par des espaces.
Copié !
1/* Assignation d'un fileref au fichier de sortie */
2filename myreport_export "/tmp/exported_shoes.txt";
3PROC EXPORT DATA=sashelp.shoes /* Utilisation d'un jeu de données SASHELP */
4 outfile=myreport_export dbms=dlm replace;
5 delimiter=' ';
6RUN;
7 
8/* Affichage du contenu du fichier de sortie */
9%inc "/tmp/exported_shoes.txt";
9 Bloc de code
FILENAME, %INCLUDE Data
Explication :
Un fileref (`mypgm`) est assigné à un fichier contenant des instructions SAS. La macro-instruction `%INCLUDE` utilise ce fileref pour inclure et exécuter le code du fichier, permettant une exécution dynamique de scripts externes.
Copié !
1/* Création d'un fichier source factice avec des instructions SAS */
2filename mypgm_source "/tmp/program_with_fileref.sas";
3DATA _null_;
4 file mypgm_source;
5 put "data another_example; a=10; b=20; result = a+b; run;";
6 put "proc print data=another_example; run;";
7RUN;
8 
9/* Assignation d'un fileref au fichier programme */
10filename mypgm "/tmp/program_with_fileref.sas";
11%include mypgm; /* Inclusion du fichier via le fileref */
10 Bloc de code
FILENAME
Explication :
L'instruction `FILENAME` peut être utilisée pour diriger la sortie vers un périphérique physique (comme une imprimante) en spécifiant le type de périphérique et les options de l'hôte. Pour cet exemple, un fichier temporaire est utilisé pour simuler la sortie vers un périphérique.
Copié !
1/* Cet exemple assigne un fileref à un périphérique de sortie. */
2/* Il ne peut pas être rendu autonome sans une configuration de périphérique spécifique. */
3/* Pour la démonstration, nous l'assignerons à un fichier factice. */
4filename myprinter "/tmp/dummy_printer_output.txt";
5DATA _null_;
6 file myprinter;
7 put "Ceci est une sortie de test vers un fichier d'imprimante factice.";
8run;
9%inc "/tmp/dummy_printer_output.txt";
11 Bloc de code
FILENAME Data
Explication :
L'instruction `FILENAME` est utilisée pour assigner un fileref (`mydir`) à un répertoire. Cela permet de référencer tous les fichiers de ce répertoire de manière concise.
Copié !
1/* Création d'un répertoire factice */
2%let temp_dir = /tmp/my_sas_files;
3%sysexec mkdir -p &temp_dir;
4 
5filename mydir "&temp_dir"; /* Assigne le fileref au répertoire */
12 Bloc de code
DATA STEP Data
Explication :
Un fileref (`mydir`) est assigné à un répertoire. L'instruction `INFILE` utilise ce fileref avec le nom du fichier entre parenthèses (`(qrt1.data)`) pour lire un fichier spécifique situé dans ce répertoire. Cela simplifie la gestion des chemins de fichiers.
Copié !
1/* Création d'un répertoire factice */
2%let temp_dir = /tmp/my_sas_files;
3%sysexec mkdir -p &temp_dir;
4 
5/* Création d'un fichier de données factice dans le répertoire */
6filename qrt1data "&temp_dir/qrt1.data";
7DATA _null_;
8 file qrt1data;
9 put "P01 100 90";
10 put "P02 110 95";
11RUN;
12 
13filename mydir "&temp_dir"; /* Assigne le fileref au répertoire */
14 
15DATA weight_aggr;
16 INFILE mydir(qrt1.DATA); /* Référence le fichier dans le répertoire via le fileref */
17 INPUT idno $ week1 week16;
18 loss=Week1-Week16;
19RUN;
20PROC PRINT DATA=weight_aggr; RUN;
13 Bloc de code
DATA STEP Data
Explication :
Un fileref (`mydir`) est assigné à un répertoire. L'instruction `FILE` utilise ce fileref avec le nom du fichier entre parenthèses (`(awards.txt)`) pour écrire un fichier spécifique dans ce répertoire, simplifiant ainsi la gestion des sorties vers des emplacements communs.
Copié !
1/* Création d'un répertoire factice */
2%let temp_dir = /tmp/my_sas_files;
3%sysexec mkdir -p &temp_dir;
4 
5/* Création de données d'entrée factices pour générer 'loss' */
6DATA temp_input_for_awards;
7 INPUT idno $ week1 week16;
8 CARDS;
9A1 70 65
10B2 80 70
11C3 90 70
12 ;
13RUN;
14 
15filename mydir "&temp_dir"; /* Assigne le fileref au répertoire */
16 
17DATA _null_;
18 SET temp_input_for_awards;
19 file mydir(awards.txt); /* Écrit dans awards.txt dans le répertoire 'mydir' */
20 loss = week1 - week16;
21 IF loss ge 5 and loss le 9 THEN
22 put idno loss 'AWARD STATUS=3';
23 ELSE IF loss ge 10 and loss le 14 THEN
24 put idno loss 'AWARD STATUS=2';
25 ELSE IF loss ge 15 THEN
26 put idno loss 'AWARD STATUS=1';
27RUN;
28 
29/* Affichage du contenu du fichier de sortie */
30filename show_awards "&temp_dir/awards.txt";
31%inc show_awards;
14 Bloc de code
%INCLUDE Data
Explication :
Un fileref (`mydir`) est assigné à un répertoire. La macro-instruction `%INCLUDE` utilise ce fileref avec le nom du fichier programme entre parenthèses (`(whole.program.sas)`) pour inclure et exécuter le code de ce fichier, facilitant la gestion des modules de code.
Copié !
1/* Création d'un répertoire factice */
2%let temp_dir = /tmp/my_sas_files;
3%sysexec mkdir -p &temp_dir;
4 
5/* Création d'un fichier programme factice dans le répertoire */
6filename whole_program "&temp_dir/whole.program.sas";
7DATA _null_;
8 file whole_program;
9 put "data final_check; a=5; b=10; result = a+b; run;";
10 put "proc print data=final_check; run;";
11RUN;
12 
13filename mydir "&temp_dir"; /* Assigne le fileref au répertoire */
14%include mydir(whole.program.sas); /* Inclut le fichier programme via le fileref */
15 Bloc de code
FILENAME Data
Explication :
Cette section présente divers spécificateurs d'accès pour l'instruction `FILENAME`, permettant de référencer des fichiers via des méthodes telles que `DATAURL` (pour les données encodées directement), `URL` (pour les ressources web), et `ZIP` (pour les fichiers archivés). D'autres spécificateurs comme `CATALOG`, `FTP`, `Hadoop`, `SOCKET` et `WebDAV` sont mentionnés pour des scénarios d'accès plus spécifiques (la plupart sont des placeholders nécessitant une configuration externe pour fonctionner réellement).
Copié !
1/* Assignation d'un fileref avec le spécificateur DATAURL - Exemple autonome */
2filename myfile_dataurl dataurl 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ=='; /* "Hello, World!" encodé en Base64 */
3DATA _null_;
4 INFILE myfile_dataurl;
5 INPUT;
6 put _infile_;
7RUN;
8 
9/* Assignation d'un fileref avec le spécificateur URL */
10/* Note: Pour une exécution réelle, cela tenterait de se connecter à la ressource distante. */
11filename myfile_url URL 'https://www.example.com/index.html';
12/* Pour lire le contenu, utilisez:
13 data _null_;
14 infile myfile_url;
15 input;
16 put _infile_;
17 run;
18*/
19 
20/* Assignation d'un fileref avec le spécificateur ZIP - Exemple autonome */
21/* Création d'un répertoire factice pour le fichier ZIP */
22%let zip_dir = /tmp/myzipfiles;
23%sysexec mkdir -p &zip_dir;
24filename file_to_zip "&zip_dir/internal_file.txt";
25DATA _null_;
26 file file_to_zip;
27 put "Contenu à l'intérieur du zip.";
28run;
29 
30/* Création du fichier ZIP et ajout du fichier interne */
31filename ziptool ZIP "&zip_dir/myarchive.zip";
32data _null_;
33 file ziptool(internal_file.txt);
34 put "Contenu à l'intérieur du zip.";
35RUN;
36filename ziptool clear;
37 
38filename myfile_zip ZIP "&zip_dir/myarchive.zip(internal_file.txt)";
39DATA _null_;
40 INFILE myfile_zip;
41 INPUT;
42 put _infile_;
43RUN;
44 
45/* Exemples de fileref avec d'autres spécificateurs (placeholders) */
46/* FILENAME mycat catalog 'my.catalog' <catalog-options>; */
47/* FILENAME myfile_ftp FTP '/path/to/remote/file.txt' host='ftp.example.com' user='myuser' password='mypassword' debug; */
48/* FILENAME myfile_hadoop hadoop '/user/sas/data.csv' <hadoop-options>; */
49/* FILENAME myfile_socket SOCKET 'localhost:12345' <tcpip-options>; */
50/* FILENAME myfile_socket_server SOCKET ':54321' SERVER <tcpip-options>; */
51/* FILENAME myfile_webdav WEBDAV 'https://webdav.example.com/docs/file.txt' <webdav-options>; */
16 Bloc de code
DATA STEP Data
Explication :
Cet exemple démontre la lecture de données binaires en SAS. Il crée d'abord un fichier binaire factice avec deux entiers de 2 octets. Ensuite, une étape DATA lit ce fichier en utilisant l'option `RECFM=N` pour le flux binaire et l'informat `IB2.` pour interpréter les octets comme des entiers binaires.
Copié !
1/* Création d'un fichier binaire factice */
2filename bindata "/tmp/binary_example.bin";
3DATA _null_;
4 file bindata recfm=N; /* N pour le flux binaire */
5 /* Écriture de deux valeurs entières de 2 octets */
6 put 12345 ib2. @; /* écrit 12345 comme entier de 2 octets */
7 put 6789 ib2.; /* écrit 6789 comme entier de 2 octets */
8RUN;
9 
10DATA read_binary;
11 INFILE bindata recfm=N;
12 INPUT Value1 ib2. Value2 ib2.; /* Lecture des entiers de 2 octets avec informat IB2. */
13RUN;
14 
15PROC PRINT DATA=read_binary;
16RUN;
17 Bloc de code
DATA STEP Data
Explication :
Pour lire des données binaires par colonne, l'instruction `INFILE` doit spécifier `RECFM=F` (Fixed record format) et `LRECL=160` (longueur d'enregistrement logique). L'exemple crée un fichier texte simple pour la démonstration, mais dans un scénario réel, des informats binaires spécifiques (`CBw.`, `ROWw.d`) seraient utilisés avec l'instruction `INPUT` pour interpréter correctement le contenu binaire.
Copié !
1/* Création d'un fichier factice avec des données binaires par colonne simulées */
2/* Dans un vrai scénario, ce fichier contiendrait des données binaires spécifiques. */
3/* Ici, nous créons un fichier texte simple pour illustrer le concept d'INFILE. */
4filename colbindata "/tmp/column_binary_example.txt";
5DATA _null_;
6 file colbindata;
7 put 'Test'; /* Simule quelques octets, non réellement binaire pour cet exemple */
8RUN;
9 
10DATA out_col_binary;
11 INFILE colbindata recfm=f lrecl=160; /* Options nécessaires pour les données binaires par colonne */
12 /* Pour un vrai fichier binaire par colonne, des informats comme CBw. ou ROWw.d seraient utilisés */
13 /* input var1 cb2.; ou input var1 row1. ; */
14 INPUT var1 $; /* Lecture simple pour la démo, adapter selon le format réel */
15RUN;
16 
17PROC PRINT DATA=out_col_binary;
18RUN;
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 : Copyright © SAS Institute Inc. All Rights Reserved


Documentation liée : Accès aux données

Sujet / Mot-cléLien vers la ressource
DOC FedSQL fr/sampleCode/FEDSQLD493
DOC Définitions des Moteurs SAS fr/sampleCode/DEFINI88E2
DOC Bibliothèques SAS par Défaut fr/sampleCode/BIBLIOB755
DOC Fonctionnement des Moteurs avec les Fichiers fr/sampleCode/FONCTI81D4
DOC Caractéristiques des moteurs SAS fr/sampleCode/CARACTABC0
DOC Définitions des Moteurs SAS fr/sampleCode/DEFINI6352
Banner
Le Conseil de l'Expert
Expert
Simon
Expert SAS et fondateur.
« Ce guide explore la mécanique de précision de SAS pour l'acquisition et l'exportation de données. Au-delà de la simple lecture de fichiers, c'est la notion d'abstraction qui est ici primordiale.

La puissance du Fileref : Utiliser un FILENAME plutôt qu'un chemin physique en dur dans vos instructions INFILE ou FILE est une règle d'or en développement. Cela rend votre code portable : pour changer de répertoire ou de serveur, vous n'avez qu'une seule ligne à modifier au début de votre programme.

L'agilité des méthodes d'accès : SAS ne se limite pas à votre disque dur. Grâce aux moteurs spécialisés (URL, FTP, ZIP, Hadoop), vous traitez une ressource distante comme s'il s'agissait d'un fichier local. L'exemple du moteur ZIP est particulièrement utile : il permet de lire ou d'écrire directement dans une archive sans étape de décompression manuelle, économisant ainsi un espace disque précieux.

Le défi du binaire : La lecture de données binaires (options RECFM=N ou F) montre que SAS peut descendre au niveau de l'octet. C'est indispensable pour interfacer SAS avec des instruments de mesure ou des formats propriétaires anciens. L'utilisation correcte des informats (comme IB2.) garantit que la conversion des octets respecte l'architecture de la donnée source.

Modularité avec %INCLUDE : Cette instruction est le ciment de vos projets complexes. Elle permet d'appeler des bibliothèques de fonctions ou des sous-programmes stockés à l'extérieur, facilitant la maintenance et la réutilisation du code.

Mon conseil : Pour la gestion de projets volumineux, utilisez les filerefs agrégés (pointant vers un répertoire). Cela vous permet de référencer vos fichiers via une syntaxe simplifiée mydir(fichier.txt), ce qui rend votre gestion documentaire beaucoup plus claire et évite les erreurs de saisie dans les longs chemins de dossiers »