Veröffentlicht am :
Datenzugriff CREATION_INTERNE

Lesen und Schreiben externer Dateien

Dieser Code ist auch verfügbar auf: Español Français
Wartet auf Validierung
Die funktionale Analyse detailliert die Verwendung von DATA Step-Anweisungen wie INFILE und INPUT zum Lesen externer Dateien sowie die Anweisungen FILE und PUT zum Schreiben von Daten. Das Konzept des Fileref wird als indirekte Referenzierungsmethode für bessere Flexibilität und Wartbarkeit des Codes eingeführt. Beispiele für die Verwendung von Filerefs mit aggregierten Speicherorten (Verzeichnissen) und verschiedenen Zugriffsmethoden (DATAURL, FTP, Hadoop, SOCKET, URL, WebDAV, ZIP) werden vorgestellt. Schließlich wird das Lesen binärer Daten mithilfe spezifischer SAS©-Informate erklärt, wobei die Bedeutung der Byte-Konvertierung und der Optionen RECFM und LRECL für spaltenweise binäre Daten hervorgehoben wird.
Datenanalyse

Type : CREATION_INTERNE


Die Beispiele verwenden generierte Daten (Datalines) oder temporäre Dateien, die vom Agenten erstellt wurden. SASHELP-Daten werden gegebenenfalls für Export-/Druckverfahren verwendet.

1 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel verwendet die Anweisung `INFILE`, um eine externe Datei (`/tmp/input-file.txt`) als Datenquelle anzugeben. Die Anweisung `INPUT` liest die Daten in die Variablen `PatientID`, `Week1`, `Week8` und `Week16`. Eine neue Variable `loss` wird berechnet, und dann zeigt die Prozedur `PRINT` den Inhalt des Datensatzes `weight` an.
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel zeigt, wie der vollständige physische Pfad einer externen Datei direkt in der Anweisung `INFILE` angegeben wird. SAS liest die Daten aus dieser Datei, um den Datensatz `weight_direct` zu erstellen.
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel veranschaulicht das Schreiben von Daten in eine externe Datei, indem ihr physischer Pfad direkt in der Anweisung `FILE` angegeben wird. Die Anweisungen `PUT` schreiben bedingte Informationen basierend auf der Variablen `loss` in die Datei `/tmp/output_status.txt`.
Kopiert!
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 Codeblock
%INCLUDE Data
Erklärung :
Die Makroanweisung `%INCLUDE` wird verwendet, um den Inhalt einer externen Datei (`/tmp/source_program.sas`) direkt in den SAS-Programmfluss einzufügen und auszuführen. Dies ermöglicht die Modularisierung von Code oder die Ausführung bereits bestehender Skripte.
Kopiert!
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 Codeblock
FILENAME, DATA STEP Data
Erklärung :
Die Anweisung `FILENAME` weist einem externen Datei einen kurzen Namen (Fileref `mydata`) zu. Dieser Fileref wird dann in der Anweisung `INFILE` zum Lesen der Daten verwendet, was eine Abstraktion des physischen Dateipfads bietet.
Kopiert!
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 Codeblock
FILENAME, PROC IMPORT Data
Erklärung :
Ein Fileref (`mydata`) wird einer delimiterten Datei zugewiesen. `PROC IMPORT` verwendet diesen Fileref, um die Daten in einen SAS-Datensatz namens `shoes` zu importieren, wobei der Delimiter und die Einbeziehung der Spaltennamen angegeben werden.
Kopiert!
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 Codeblock
FILENAME, DATA STEP Data
Erklärung :
Nachdem die Variable `loss` aus temporären Daten berechnet wurde, wird ein Fileref (`myreport_output`) einer Ausgabedatei zugewiesen. Die Anweisung `FILE` in einem DATA Step `_null_` verwendet dann diesen Fileref, um die Ergebnisse in die angegebene Datei zu schreiben.
Kopiert!
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 Codeblock
FILENAME, PROC EXPORT
Erklärung :
Dieses Beispiel verwendet `PROC EXPORT`, um den Datensatz `SASHELP.SHOES` in eine externe Datei (`/tmp/exported_shoes.txt`) zu exportieren, deren Name durch den Fileref `myreport_export` definiert ist. Die Daten werden als durch Leerzeichen getrennte Daten exportiert.
Kopiert!
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 Codeblock
FILENAME, %INCLUDE Data
Erklärung :
Ein Fileref (`mypgm`) wird einer Datei zugewiesen, die SAS-Anweisungen enthält. Die Makroanweisung `%INCLUDE` verwendet diesen Fileref, um den Code aus der Datei einzuschließen und auszuführen, was eine dynamische Ausführung externer Skripte ermöglicht.
Kopiert!
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 Codeblock
FILENAME
Erklärung :
Die Anweisung `FILENAME` kann verwendet werden, um die Ausgabe an ein physisches Gerät (z. B. einen Drucker) zu leiten, indem der Gerätetyp und die Hostoptionen angegeben werden. Für dieses Beispiel wird eine temporäre Datei verwendet, um die Ausgabe an ein Gerät zu simulieren.
Kopiert!
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 Codeblock
FILENAME Data
Erklärung :
Die Anweisung `FILENAME` wird verwendet, um einem Verzeichnis einen Fileref (`mydir`) zuzuweisen. Dies ermöglicht die prägnante Referenzierung aller Dateien in diesem Verzeichnis.
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung :
Ein Fileref (`mydir`) wird einem Verzeichnis zugewiesen. Die Anweisung `INFILE` verwendet diesen Fileref mit dem Dateinamen in Klammern (`(qrt1.data)`), um eine bestimmte Datei in diesem Verzeichnis zu lesen. Dies vereinfacht die Verwaltung von Dateipfaden.
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung :
Ein Fileref (`mydir`) wird einem Verzeichnis zugewiesen. Die Anweisung `FILE` verwendet diesen Fileref mit dem Dateinamen in Klammern (`(awards.txt)`), um eine bestimmte Datei in diesem Verzeichnis zu schreiben, was die Verwaltung von Ausgaben an gemeinsame Speicherorte vereinfacht.
Kopiert!
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 Codeblock
%INCLUDE Data
Erklärung :
Ein Fileref (`mydir`) wird einem Verzeichnis zugewiesen. Die Makroanweisung `%INCLUDE` verwendet diesen Fileref mit dem Programmdateinamen in Klammern (`(whole.program.sas)`), um den Code aus dieser Datei einzuschließen und auszuführen, was die Verwaltung von Code-Modulen erleichtert.
Kopiert!
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 Codeblock
FILENAME Data
Erklärung :
Dieser Abschnitt stellt verschiedene Zugriffsspezifizierer für die Anweisung `FILENAME` vor, die es ermöglichen, Dateien über Methoden wie `DATAURL` (für direkt kodierte Daten), `URL` (für Webressourcen) und `ZIP` (für archivierte Dateien) zu referenzieren. Andere Spezifizierer wie `CATALOG`, `FTP`, `Hadoop`, `SOCKET` und `WebDAV` werden für spezifischere Zugriffsszenarien erwähnt (die meisten sind Platzhalter, die eine externe Konfiguration erfordern, um tatsächlich zu funktionieren).
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung :
Dieses Beispiel demonstriert das Lesen binärer Daten in SAS. Zuerst wird eine Dummy-Binärdatei mit zwei 2-Byte-Integern erstellt. Anschließend liest ein DATA Step diese Datei unter Verwendung der Option `RECFM=N` für den Binärstrom und des Informats `IB2.`, um die Bytes als Binärinteger zu interpretieren.
Kopiert!
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 Codeblock
DATA STEP Data
Erklärung :
Zum spaltenweisen Lesen binärer Daten muss die Anweisung `INFILE` `RECFM=F` (Fixed record format) und `LRECL=160` (logische Datensatzlänge) angeben. Das Beispiel erstellt eine einfache Textdatei zur Demonstration, aber in einem realen Szenario würden spezifische Binärformate (`CBw.`, `ROWw.d`) mit der Anweisung `INPUT` verwendet, um den binären Inhalt korrekt zu interpretieren.
Kopiert!
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;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : Copyright © SAS Institute Inc. All Rights Reserved


Banner
Expertenrat
Expert
Simon
Expert SAS et fondateur.
« Der effiziente Umgang mit externen Dateien ist das Fundament jeder Datenintegration. SAS bietet hierfür mit den Anweisungen INFILE/INPUT (Lesen) und FILE/PUT (Schreiben) eine hochgradig anpassbare Engine.

Um Ihre Programme robuster und wartungsfreundlicher zu gestalten, sollten Sie folgende Experten-Strategien anwenden:

Nutzen Sie konsequent Filerefs: Verwenden Sie die FILENAME-Anweisung, um indirekte Referenzen (Filerefs) zu erstellen, anstatt Pfade direkt in den DATA Step zu schreiben. Dies ermöglicht es Ihnen, den Speicherort einer Datei an einer einzigen Stelle im Programm zu ändern, ohne den gesamten Code durchsuchen zu müssen.

Strukturieren Sie Verzeichnisse: Filerefs können nicht nur auf Dateien, sondern auch auf ganze Verzeichnisse zeigen. Durch die Syntax Infile Fileref(Dateiname); können Sie innerhalb eines Programms flexibel auf verschiedene Dateien in einem aggregierten Speicherort zugreifen.

Wählen Sie die richtige Zugriffsmethode: SAS ist nicht auf lokale Dateien beschränkt. Mit Filerefs können Sie über spezifische Engines wie ZIP (komprimierte Dateien), URL (Webressourcen) oder FTP direkt auf Daten zugreifen, ohne diese vorher manuell herunterzuladen oder zu entpacken.

Präzision bei Binärdaten: Verwenden Sie beim Umgang mit nicht-textuellen Daten unbedingt die Optionen RECFM=N (Binary Stream) oder RECFM=F (Fixed Length) in der INFILE-Anweisung. Nur so stellen Sie sicher, dass SAS die Daten byteweise korrekt interpretiert und nicht an Zeilenumbruchzeichen hängen bleibt. »