Publicado el :
Acceso a datos CREATION_INTERNE

Lectura y escritura de archivos externos

Este código también está disponible en: Deutsch Français
En espera de validación
El análisis funcional detalla el uso de instrucciones DATA Step como INFILE e INPUT para leer archivos externos, así como la instrucción FILE y PUT para escribir datos. El concepto de fileref se introduce como un método de referencia indirecta para una mayor flexibilidad y mantenibilidad del código. Se presentan ejemplos del uso de filerefs con ubicaciones de almacenamiento agregadas (directorios) y varios métodos de acceso (DATAURL, FTP, Hadoop, SOCKET, URL, WebDAV, ZIP). Finalmente, se explica la lectura de datos binarios utilizando informats SAS© específicos, destacando la importancia de la conversión de bytes y las opciones RECFM y LRECL para datos binarios por columna.
Análisis de datos

Type : CREATION_INTERNE


Los ejemplos utilizan datos generados (datalines) o archivos temporales creados por el agente. Los datos SASHELP se utilizan cuando es apropiado para procedimientos de exportación/impresión.

1 Bloque de código
DATA STEP Data
Explicación :
Este ejemplo utiliza la instrucción `INFILE` para especificar un archivo externo (`/tmp/input-file.txt`) como fuente de datos. La instrucción `INPUT` lee los datos en las variables `PatientID`, `Week1`, `Week8` y `Week16`. Se calcula una nueva variable `loss`, y luego el procedimiento `PRINT` muestra el contenido del conjunto de datos `weight`.
¡Copiado!
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 Bloque de código
DATA STEP Data
Explicación :
Este ejemplo muestra cómo especificar directamente la ruta física completa de un archivo externo en la instrucción `INFILE`. SAS lee los datos de este archivo para crear el conjunto de datos `weight_direct`.
¡Copiado!
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 Bloque de código
DATA STEP Data
Explicación :
Este ejemplo ilustra la escritura de datos en un archivo externo especificando directamente su ruta física en la instrucción `FILE`. Las instrucciones `PUT` escriben información condicional basada en la variable `loss` en el archivo `/tmp/output_status.txt`.
¡Copiado!
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 Bloque de código
%INCLUDE Data
Explicación :
La macroinstrucción `%INCLUDE` se utiliza para insertar y ejecutar el contenido de un archivo externo (`/tmp/source_program.sas`) directamente en el flujo del programa SAS. Esto permite modularizar el código o ejecutar scripts preexistentes.
¡Copiado!
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 Bloque de código
FILENAME, DATA STEP Data
Explicación :
La instrucción `FILENAME` asigna un nombre corto (fileref `mydata`) a un archivo externo. Este fileref se utiliza luego en la instrucción `INFILE` para leer los datos, ofreciendo una abstracción de la ruta física del archivo.
¡Copiado!
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 Bloque de código
FILENAME, PROC IMPORT Data
Explicación :
Se asigna un fileref (`mydata`) a un archivo delimitado. `PROC IMPORT` utiliza este fileref para importar los datos a un conjunto de datos SAS llamado `shoes`, especificando el delimitador y la inclusión de los nombres de columna.
¡Copiado!
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 Bloque de código
FILENAME, DATA STEP Data
Explicación :
Después de calcular la variable `loss` a partir de datos temporales, se asigna un fileref (`myreport_output`) a un archivo de salida. La instrucción `FILE` en un paso DATA `_null_` utiliza luego este fileref para escribir los resultados en el archivo especificado.
¡Copiado!
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 Bloque de código
FILENAME, PROC EXPORT
Explicación :
Este ejemplo utiliza `PROC EXPORT` para exportar el conjunto de datos `SASHELP.SHOES` a un archivo externo (`/tmp/exported_shoes.txt`) cuyo nombre está definido por el fileref `myreport_export`. Los datos se exportan como datos delimitados por espacios.
¡Copiado!
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 Bloque de código
FILENAME, %INCLUDE Data
Explicación :
Se asigna un fileref (`mypgm`) a un archivo que contiene instrucciones SAS. La macroinstrucción `%INCLUDE` utiliza este fileref para incluir y ejecutar el código del archivo, lo que permite una ejecución dinámica de scripts externos.
¡Copiado!
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 Bloque de código
FILENAME
Explicación :
La instrucción `FILENAME` se puede utilizar para dirigir la salida a un dispositivo físico (como una impresora) especificando el tipo de dispositivo y las opciones del host. Para este ejemplo, se utiliza un archivo temporal para simular la salida a un dispositivo.
¡Copiado!
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 Bloque de código
FILENAME Data
Explicación :
La instrucción `FILENAME` se utiliza para asignar un fileref (`mydir`) a un directorio. Esto permite referenciar todos los archivos de este directorio de manera concisa.
¡Copiado!
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 Bloque de código
DATA STEP Data
Explicación :
Se asigna un fileref (`mydir`) a un directorio. La instrucción `INFILE` utiliza este fileref con el nombre del archivo entre paréntesis (`(qrt1.data)`) para leer un archivo específico ubicado en este directorio. Esto simplifica la gestión de las rutas de los archivos.
¡Copiado!
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 Bloque de código
DATA STEP Data
Explicación :
Se asigna un fileref (`mydir`) a un directorio. La instrucción `FILE` utiliza este fileref con el nombre del archivo entre paréntesis (`(awards.txt)`) para escribir un archivo específico en este directorio, simplificando así la gestión de las salidas a ubicaciones comunes.
¡Copiado!
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 Bloque de código
%INCLUDE Data
Explicación :
Se asigna un fileref (`mydir`) a un directorio. La macroinstrucción `%INCLUDE` utiliza este fileref con el nombre del archivo de programa entre paréntesis (`(whole.program.sas)`) para incluir y ejecutar el código de este archivo, lo que facilita la gestión de los módulos de código.
¡Copiado!
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 Bloque de código
FILENAME Data
Explicación :
Esta sección presenta varios especificadores de acceso para la instrucción `FILENAME`, permitiendo referenciar archivos a través de métodos como `DATAURL` (para datos directamente codificados), `URL` (para recursos web) y `ZIP` (para archivos comprimidos). Otros especificadores como `CATALOG`, `FTP`, `Hadoop`, `SOCKET` y `WebDAV` se mencionan para escenarios de acceso más específicos (la mayoría son marcadores de posición que requieren una configuración externa para funcionar realmente).
¡Copiado!
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 Bloque de código
DATA STEP Data
Explicación :
Este ejemplo demuestra la lectura de datos binarios en SAS. Primero crea un archivo binario ficticio con dos enteros de 2 bytes. Luego, un paso DATA lee este archivo utilizando la opción `RECFM=N` para el flujo binario y el informat `IB2.` para interpretar los bytes como enteros binarios.
¡Copiado!
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 Bloque de código
DATA STEP Data
Explicación :
Para leer datos binarios por columna, la instrucción `INFILE` debe especificar `RECFM=F` (Fixed record format) y `LRECL=160` (longitud de registro lógico). El ejemplo crea un archivo de texto simple para la demostración, pero en un escenario real, se utilizarían informats binarios específicos (`CBw.`, `ROWw.d`) con la instrucción `INPUT` para interpretar correctamente el contenido binario.
¡Copiado!
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;
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 : Copyright © SAS Institute Inc. All Rights Reserved