2016-08-12 3 views
2

Ich habe eine Makrovariable &myfiles, die eine Liste der Namen von vier Datasets enthält.Kopieren/Umbenennen mehrerer sas Datasets basierend auf Makrovariablen Werte

Dabei ist cpo ein libname.

Ich versuche, vier neue Datensätze mit Namen aus einer anderen Makrovariablen zu erzeugen, die ich &New_Datasets benannt haben:

%put &New_Datasets; 
CDR Cog Mile Path 

Ich habe versucht, nur einen Daten Schritt wie folgt zu verwenden:

data &New_Datasets; 
    set &myfiles; 
run; 

, aber dies führte dazu, dass alle Beobachtungen der vier Datensätze, auf die in &mylist verwiesen wurde, kombiniert und in jeden der vier in &New_Datasets referenzierten Datensätze mit der folgenden Ausgabe aus dem Protokoll eingetragen wurden:

NOTE: There were 1482 observations read from the data set CPO.CDR_2016JUN. 
NOTE: There were 1444 observations read from the data set CPO.COG_2016JUN. 
NOTE: There were 255 observations read from the data set CPO.MILE_2016JUN. 
NOTE: There were 7 observations read from the data set CPO.PATH_2016JUN. 
NOTE: The data set WORK.CDR has 3188 observations and 1580 variables. 
NOTE: The data set WORK.COG has 3188 observations and 1580 variables. 
NOTE: The data set WORK.MILE has 3188 observations and 1580 variables. 
NOTE: The data set WORK.PATH has 3188 observations and 1580 variables. 

Was ich will zu tun ist, die 1482 Beobachtungen hat aus cpo.cdr_2016jun ein Daten erstellen gesetzt work.cdr mit 1.482 Beobachtungen und so weiter, sondern als eine Kombination der in den referenzierten diejenigen sein, jedes der neuen Datensatz Anweisung setzen. Jede Hilfe würde sehr geschätzt werden, danke!

+1

Wenn Sie die Makrovariablen nicht hatten, welchen SAS-Code würden Sie verwenden, um die gewünschten Datensätze zu erstellen? Sobald Sie den Code kennen, den Sie generieren möchten, ist es einfacher, Makro-Logik zu verwenden, um sie zu generieren. – Tom

Antwort

2

Sie müssen ein Makroprogramm schreiben, das die Werte in Ihren Makrovariablen durchläuft und Datenschritt oder Proc-Kopie aufruft.

Macro:

%macro rewriteDataSets(source_tables=, dest_tables=); 
    %local ii num_source_tables num_dest_tables source_name dest_name; 

    %let num_source_tables = %sysfunc(countw(&source_tables, %str())); 
    %let num_dest_tables = %sysfunc(countw(&dest_tables , %str())); 

    %if &num_source_tables ne &num_dest_tables %then %do; 
     %put ERROR: The number of source and destination tables must be the same in the call to rewriteDataSets; 
     %abort cancel; 
    %end; 

    %do ii=1 %to &num_source_tables; 

     %let source_name = %scan(&source_tables, &ii, %str()); 
     %let dest_name = %scan(&dest_tables , &ii, %str()); 

     data &dest_name; 
     set &source_name; 
     run; 

    %end; 
%mend rewriteDataSets; 

Verwendungsbeispiel:

%rewriteDataSets(source_tables = sashelp.class sashelp.class, 
       dest_tables = a b); 

Oder die Tabellen, die Sie angegeben, würden Sie es so nennen:

%rewriteDataSets(source_tables = cpo.CDR_2016jun cpo.Cog_2016jun cpo.Mile_2016jun cpo.Path_2016jun, 
       dest_tables = CDR Cog Mile Path); 

Or Verwenden Sie proc copy anstelle von Datenschritt.

+0

Dies funktioniert mit der kleinen Bearbeitung, die im Makro% revriteDatasets & myfiles und & New_Datasets geschaltet werden sollte. Vielen Dank! –

+0

Ich mag das generell, aber Sie sollten keine globalen Makrovariablen verwenden. Übergeben Sie '& myfiles' und' & new_datasets' als Parameter. – Joe

+0

Ich habe den Code ein wenig aktualisiert, um es einfacher zu machen, um zu sehen, wie es funktioniert (für diejenigen, die weniger mit Makros vertraut sind), und ich habe einige grundlegende Fehlerüberprüfungen hinzugefügt. –

3

Ich würde meine Makrovariable etwas anders definieren und so etwas tun:

%let oldnames = CDR_2016jun Cog_2016jun Mile_2016jun Path_2016jun; 
%let newnames = CDR Cog Mile Path; 

proc datasets lib = cpo noprint; 
    copy out = work; 
    select &oldnames; 
    run; 
quit; 

%macro changes; 
%local i; 
%do i = 1 %to %sysfunc(countw(&oldnames)); 
    %scan(&oldnames, &i, %str()) = %scan(&newnames, &i, %str()) 
%end; 
%mend changes; 

proc datasets lib = work noprint; 
    change %changes; 
    run; 
quit; 

Alternativ Sie Ansichten in work des ursprünglichen Datensätze in cpo schaffen könnten.

+0

Ich schätze Ihre Antwort, ich bin nicht vertraut genug mit Proc-Datensätzen, um dies jetzt zu verwenden, aber werde es untersuchen. Ich würde dir eine Erhöhung geben, wenn mein Ruf hoch genug wäre. –

+0

@RMontgomery Wenn Sie Dateien umbenennen müssen, ist 'proc datasets' der schnellste Weg. Wenn kopiere dann 'proc copy' oder' proc datasts' mit 'copy' Anweisung. Wenn beim Umschreiben eine Logik implementiert wird, dann "Datenschritt". Aber bei kleinen Datensätzen, wie Sie sie haben, brauchen Sie sich nicht darauf zu konzentrieren. Wählen Sie einfach die Methode, die Ihnen am besten passt. – fl0r3k

+0

@ fl0r3k danke für die Info, ich lese jetzt über Proc-Datensätze. Ich werde diesen Code auf viel größeren Datensätzen verwenden, um einen aktuellen Prozess zu rationalisieren, so dass jede zusätzliche Effizienz vorzuziehen ist. Ich muss weiterlesen, danke! –

Verwandte Themen