2016-06-17 5 views
0

Wenn ich meine Makros zur Eingabe von Daten aus mehreren Dateien in eine SAS-Tabelle ausführen, wird jedes einzelne Dataset ersetzt Einlesen, sobald die nächste Iteration beginnt. Daher ist die letzte Datei, die ich mit der Schleife eingelesen habe, die einzige Daten, die ich in meiner Final Table übrig habe. Wie kann ich meine Ausgabetabelle am Ende jeder Lese-Iteration anhängen, um zu verhindern, dass bei jedem Wechsel zur nächsten Datei Daten verloren gehen?SAS Verwenden einer DO-Schleife zum Einlesen mehrerer Dateien, muss jedoch die Tabelle in jeder Iteration anhängen, um Datenverluste zu vermeiden

Aktuelle Code:

%let type=40; 

%let year=2015; 

%let months =07; 

%let days = 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31; 

%let filetype=.csv; 



%macro import_files; 


        %do K=1 %to 31; /*day*/ 

          /*Scans through Macro Variable Arrays to find current month, year and letter group*/ 

          %let nmbr = %scan(&type,1); 

          %let yr=%scan(&year,1); 

          %let mnth=%scan(&months,1); 

          %let day=%scan(&days,&K); 



          /*Creates string variables for Export and import locations of files using macro loop variables*/ 

          %let exportfile = "C:\Users\wwn\Documents\HistoricalRateTesting\Top&nmbr&yr&mnth&day&filetype"; 

          %let src = "\\2119\Raw_Data\Transposed_Canvass\Top&nmbr&yr&mnth&day&filetype"; 


          /*Imports All files in that Alpha, Year and Month Group*/ 

          DATA work.RAW_DATA; 

           INFILE &src firstobs=3 LRECL=1000 DELIMITER=',' TRUNCOVER DSD; 
/*        informat arv_dt mmddyy10. shop_dttm DATETIME18. arv_tm time5. rtrn_tm time5.;*/ 
/*        format shop_dttm DATETIME18. arv_tm time5. rtrn_tm time5.;*/ 

           INPUT 

            city_cd   : $CHAR3. 

            rtrn_city_cd  : $CHAR3. 

            shop_car_type_cd : $CHAR4. 

            shop_rt_categ : $CHAR2. 

            shop_rt_type  : $CHAR1. 

            lor    : ?? BEST2. 

            arv_tm   : ?? TIME5. 

            rtrn_tm   : ??TIME5. 

            arv_dt   : ?? MMDDYY10. 

            shop_dttm  : ANYDTDTM. 

            Brand_ZE   : ?? BEST10.2 

            Brand_ZI   : ?? BEST10.2 

            Brand_ZL   : ?? BEST10.2 

            Brand_ZD   : ?? BEST10.2 

            Brand_AL   : ?? BEST10.2 

            Brand_ZR   : ?? BEST10.2 

            Brand_ET   : ?? BEST10.2 

            Brand_ZT   : ?? BEST10.2 

            Brand_AD   : ?? BEST10.2 

            Brand_ZA   : ?? BEST10.2 

            Brand_EZ   : ?? BEST10.2 

            Brand_SX   : ?? BEST10.2 

            Brand_FX   : ?? BEST10.2 

            Brand_FF   : ?? BEST10.2; 

       RUN; 

            %end; 

            %mend import_files; 
            %import_files; 
+0

Sie erstellen jedes Mal ein neues Dataset work.RAW_DATA auf diese Weise. Erstellen Sie es einfach einmal für k = 1 und verwenden Sie dann proc append – kl78

+0

Vielleicht wird dies hilfreich sein. Sieht so aus, als hättest du eine Antwort auf deine Terminfrage gefunden? https://communities.sas.com/t5/SAS-Communities-Library/How-do-I-write-a-macro-to-import-multiple-text-files-that-have/ta-p/223627 – Reeza

Antwort

2

Da es alle Dateien scheint tun haben das gleiche Layout, Sie haben einen schönen Trick seit SAS 8.2.

Zuerst deklarieren Sie die Liste aller Dateien. Wenn Ihr Verzeichnis enthält alle Dateien, die Sie lesen möchten - und nur die eine:

filename myfiles ("\\2119\Raw_Data\Transposed_Canvass\*"); 

Dann die Erklärung verwenden myfiles innerhalb der INFILE Anweisung:

DATA work.RAW_DATA; 
    INFILE myfiles firstobs=3 LRECL=1000 DELIMITER=',' TRUNCOVER DSD; 
/* ... */ 
RUN; 

Wenn Ihr Ordner enthält andere Dateien, müssten Sie zuerst präzisieren, welche Dateien Sie mit einem kleinen Makro lesen möchten, um die Liste der Dateien so zu erweitern, dass Sie haben;

+0

Behandelt das Header in allen Dateien? Sie können die Wildcard in die Anweisung infile einfügen, die Sie in der Anweisung filename nicht benötigen. – Reeza