/****************************************************************************** * Programme : SAS & Data Engineering : Comment lire et écrire des fichiers (ZIP, FTP, URL, Hadoop) * Reference : LECTUR94DD * Source : https://www.wearecas.eu/en/sampleCode/LECTUR94DD ******************************************************************************/ /* --- BLOC 1 --- */ /* Création d'un fichier d'entrée factice */ filename mydata_example1 "/tmp/input-file.txt"; data _null_; file mydata_example1; put "101 70 68 65"; put "102 80 78 75"; put "103 90 88 85"; run; data weight; infile mydata_example1; input PatientID $ Week1 Week8 Week16; loss=Week1-Week16; run; proc print data=weight; run; /* --- BLOC 2 --- */ /* Création d'un fichier d'entrée factice */ filename temp_input_direct "/tmp/direct_input.txt"; data _null_; file temp_input_direct; put "A01 70 65"; put "B02 80 72"; put "C03 90 83"; run; data weight_direct; infile '/tmp/direct_input.txt'; /* Chemin direct vers le fichier */ input idno $ week1 week16; loss=week1-week16; run; proc print data=weight_direct; run; /* --- BLOC 3 --- */ /* Création de données factices pour calculer 'loss' */ filename temp_input_for_status "/tmp/direct_input_for_status.txt"; data _null_; file temp_input_for_status; put "A01 70 65"; /* loss = 5 */ put "B02 80 70"; /* loss = 10 */ put "C03 90 70"; /* loss = 20 */ run; data weight_for_status; infile temp_input_for_status; input idno $ week1 week16; loss=Week1-Week16; run; /* Écriture du statut dans un fichier externe */ filename temp_output_status "/tmp/output_status.txt"; data _null_; set weight_for_status; file temp_output_status; /* Chemin direct vers le fichier de sortie */ if loss ge 5 and loss le 9 then put idno loss 'AWARD STATUS=3'; else if loss ge 10 and loss le 14 then put idno loss 'AWARD STATUS=2'; else if loss ge 15 then put idno loss 'AWARD STATUS=1'; run; /* Affichage du contenu du fichier de sortie */ %inc "/tmp/output_status.txt"; /* --- BLOC 4 --- */ /* Création d'un fichier source factice avec des instructions SAS */ filename source_pgm_include "/tmp/source_program.sas"; data _null_; file source_pgm_include; put "data example; x=1; y=2; run;"; put "proc print data=example; run;"; run; %include '/tmp/source_program.sas'; /* Inclusion directe du fichier */ /* --- BLOC 5 --- */ /* Création d'un fichier d'entrée factice */ filename mydata_ref_input "/tmp/ref_input.txt"; data _null_; file mydata_ref_input; put "ID001 50 45"; put "ID002 60 55"; run; /* Assignation d'un fileref au fichier */ filename mydata "/tmp/ref_input.txt"; data weight_ref; infile mydata; /* Utilisation du fileref */ input idno $ week1 week16; loss=week1-week16; run; proc print data=weight_ref; run; /* --- BLOC 6 --- */ /* Création d d'un fichier d'entrée délimité factice */ filename mydata_ref_import "/tmp/ref_import.txt"; data _null_; file mydata_ref_import; put "Brand,Size,Color"; put "Nike,10,Black"; put "Adidas,9,White"; run; /* Assignation d'un fileref au fichier */ filename mydata "/tmp/ref_import.txt"; proc import datafile=mydata /* Utilisation du fileref */ out=shoes dbms=dlm replace; delimiter=','; getnames=YES; run; proc print data=shoes; run; /* --- BLOC 7 --- */ /* Création de données d'entrée factices pour générer 'loss' */ data temp_input_for_report; input idno $ week1 week16; cards; ID1 100 90 ID2 80 75 ; run; /* Calcul de 'loss' et écriture dans un fichier externe via fileref */ filename myreport_output "/tmp/my_report.txt"; data _null_; set temp_input_for_report; file myreport_output; /* Utilisation du fileref pour la sortie */ loss = week1 - week16; put idno "Loss=" loss; run; /* Affichage du contenu du fichier de sortie */ %inc "/tmp/my_report.txt"; /* --- BLOC 8 --- */ /* Assignation d'un fileref au fichier de sortie */ filename myreport_export "/tmp/exported_shoes.txt"; proc export data=sashelp.shoes /* Utilisation d'un jeu de données SASHELP */ outfile=myreport_export dbms=dlm replace; delimiter=' '; run; /* Affichage du contenu du fichier de sortie */ %inc "/tmp/exported_shoes.txt"; /* --- BLOC 9 --- */ /* Création d'un fichier source factice avec des instructions SAS */ filename mypgm_source "/tmp/program_with_fileref.sas"; data _null_; file mypgm_source; put "data another_example; a=10; b=20; result = a+b; run;"; put "proc print data=another_example; run;"; run; /* Assignation d'un fileref au fichier programme */ filename mypgm "/tmp/program_with_fileref.sas"; %include mypgm; /* Inclusion du fichier via le fileref */ /* --- BLOC 10 --- */ /* Cet exemple assigne un fileref à un périphérique de sortie. */ /* Il ne peut pas être rendu autonome sans une configuration de périphérique spécifique. */ /* Pour la démonstration, nous l'assignerons à un fichier factice. */ filename myprinter "/tmp/dummy_printer_output.txt"; data _null_; file myprinter; put "Ceci est une sortie de test vers un fichier d'imprimante factice."; run; %inc "/tmp/dummy_printer_output.txt"; /* --- BLOC 11 --- */ /* Création d'un répertoire factice */ %let temp_dir = /tmp/my_sas_files; %sysexec mkdir -p &temp_dir; filename mydir "&temp_dir"; /* Assigne le fileref au répertoire */ /* --- BLOC 12 --- */ /* Création d'un répertoire factice */ %let temp_dir = /tmp/my_sas_files; %sysexec mkdir -p &temp_dir; /* Création d'un fichier de données factice dans le répertoire */ filename qrt1data "&temp_dir/qrt1.data"; data _null_; file qrt1data; put "P01 100 90"; put "P02 110 95"; run; filename mydir "&temp_dir"; /* Assigne le fileref au répertoire */ data weight_aggr; infile mydir(qrt1.data); /* Référence le fichier dans le répertoire via le fileref */ input idno $ week1 week16; loss=Week1-Week16; run; proc print data=weight_aggr; run; /* --- BLOC 13 --- */ /* Création d'un répertoire factice */ %let temp_dir = /tmp/my_sas_files; %sysexec mkdir -p &temp_dir; /* Création de données d'entrée factices pour générer 'loss' */ data temp_input_for_awards; input idno $ week1 week16; cards; A1 70 65 B2 80 70 C3 90 70 ; run; filename mydir "&temp_dir"; /* Assigne le fileref au répertoire */ data _null_; set temp_input_for_awards; file mydir(awards.txt); /* Écrit dans awards.txt dans le répertoire 'mydir' */ loss = week1 - week16; if loss ge 5 and loss le 9 then put idno loss 'AWARD STATUS=3'; else if loss ge 10 and loss le 14 then put idno loss 'AWARD STATUS=2'; else if loss ge 15 then put idno loss 'AWARD STATUS=1'; run; /* Affichage du contenu du fichier de sortie */ filename show_awards "&temp_dir/awards.txt"; %inc show_awards; /* --- BLOC 14 --- */ /* Création d'un répertoire factice */ %let temp_dir = /tmp/my_sas_files; %sysexec mkdir -p &temp_dir; /* Création d'un fichier programme factice dans le répertoire */ filename whole_program "&temp_dir/whole.program.sas"; data _null_; file whole_program; put "data final_check; a=5; b=10; result = a+b; run;"; put "proc print data=final_check; run;"; run; filename mydir "&temp_dir"; /* Assigne le fileref au répertoire */ %include mydir(whole.program.sas); /* Inclut le fichier programme via le fileref */ /* --- BLOC 15 --- */ /* Assignation d'un fileref avec le spécificateur DATAURL - Exemple autonome */ filename myfile_dataurl dataurl 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ=='; /* "Hello, World!" encodé en Base64 */ data _null_; infile myfile_dataurl; input; put _infile_; run; /* Assignation d'un fileref avec le spécificateur URL */ /* Note: Pour une exécution réelle, cela tenterait de se connecter à la ressource distante. */ filename myfile_url URL 'https://www.example.com/index.html'; /* Pour lire le contenu, utilisez: data _null_; infile myfile_url; input; put _infile_; run; */ /* Assignation d'un fileref avec le spécificateur ZIP - Exemple autonome */ /* Création d'un répertoire factice pour le fichier ZIP */ %let zip_dir = /tmp/myzipfiles; %sysexec mkdir -p &zip_dir; filename file_to_zip "&zip_dir/internal_file.txt"; data _null_; file file_to_zip; put "Contenu à l'intérieur du zip."; run; /* Création du fichier ZIP et ajout du fichier interne */ filename ziptool ZIP "&zip_dir/myarchive.zip"; data _null_; file ziptool(internal_file.txt); put "Contenu à l'intérieur du zip."; run; filename ziptool clear; filename myfile_zip ZIP "&zip_dir/myarchive.zip(internal_file.txt)"; data _null_; infile myfile_zip; input; put _infile_; run; /* Exemples de fileref avec d'autres spécificateurs (placeholders) */ /* FILENAME mycat catalog 'my.catalog' ; */ /* FILENAME myfile_ftp FTP '/path/to/remote/file.txt' host='ftp.example.com' user='myuser' password='mypassword' debug; */ /* FILENAME myfile_hadoop hadoop '/user/sas/data.csv' ; */ /* FILENAME myfile_socket SOCKET 'localhost:12345' ; */ /* FILENAME myfile_socket_server SOCKET ':54321' SERVER ; */ /* FILENAME myfile_webdav WEBDAV 'https://webdav.example.com/docs/file.txt' ; */ /* --- BLOC 16 --- */ /* Création d'un fichier binaire factice */ filename bindata "/tmp/binary_example.bin"; data _null_; file bindata recfm=N; /* N pour le flux binaire */ /* Écriture de deux valeurs entières de 2 octets */ put 12345 ib2. @; /* écrit 12345 comme entier de 2 octets */ put 6789 ib2.; /* écrit 6789 comme entier de 2 octets */ run; data read_binary; infile bindata recfm=N; input Value1 ib2. Value2 ib2.; /* Lecture des entiers de 2 octets avec informat IB2. */ run; proc print data=read_binary; run; /* --- BLOC 17 --- */ /* Création d'un fichier factice avec des données binaires par colonne simulées */ /* Dans un vrai scénario, ce fichier contiendrait des données binaires spécifiques. */ /* Ici, nous créons un fichier texte simple pour illustrer le concept d'INFILE. */ filename colbindata "/tmp/column_binary_example.txt"; data _null_; file colbindata; put 'Test'; /* Simule quelques octets, non réellement binaire pour cet exemple */ run; data out_col_binary; infile colbindata recfm=f lrecl=160; /* Options nécessaires pour les données binaires par colonne */ /* Pour un vrai fichier binaire par colonne, des informats comme CBw. ou ROWw.d seraient utilisés */ /* input var1 cb2.; ou input var1 row1. ; */ input var1 $; /* Lecture simple pour la démo, adapter selon le format réel */ run; proc print data=out_col_binary; run;