Umbenennung von Spaltennamen über Schleife(n)
Verfasst von Chris86 am 11 August, 2008 - 13:25
Guten Tag liebe Forengemeinde,
ich habe aktuell folgendes Problem:
Ich möchte mehrere Spalten umkodieren und dies soll außerhalb eines Makros geschehen (die Lösung mit Hilfe eines Makros ist mir zu leicht, da ich finde es müsste auch so gehen + und ich möchte gerne etwas dazu lernen :-) )
Die einzelnen Spaltennamen unterscheiden sich dabei nur im ersten Teil des Names, was man an folgenden kleinen Testbeispiel sieht - dies verursacht aber Fehlermeldungen!! Und wenn ich Funktionen wie Cats, compress usw. verwende kommt die Fehlermeldung, dass er ein Array sucht/vermutet...
data test;
set datei;
do i=1 to 3;
do z= 0 to 38;
'name1'||i||'_t'||z = 'namealt'||i||'_t'||z;
end;
end;
run;
set datei;
do i=1 to 3;
do z= 0 to 38;
'name1'||i||'_t'||z = 'namealt'||i||'_t'||z;
end;
end;
run;
»
- Anmelden oder Registrieren um Kommentare zu schreiben

Umbenennung
Hallo Chris86,
auch wenn ich nicht Jan Heuer bin.
Geht ganz genauso:
z.B.
data work.test;
test1_08='';
test2_08='';
test3_08='';
test4='';
run;
Proc sql ;
select cats(Name ,"=", substr(name,1,length(name)-2),'07')
into :rename separated by " "
from dictionary.columns
where libname="WORK" and memname="TEST" and substr(name,length(name)-1,2)='08'
;
quit;
data work.test;
set work.test;
rename &rename;
run;
Grüße
G. Weist
Umbenennen vs. Zuweisen
Das, was Sie da in dem DATA-Schritt machen, ist keine Umbenennung, sondern eine Zuweisung. Und da muss auf der linken Seite immer ein Variablennamen stehen (und kein Textstring). Ohne Macro geht es in dem Fall nicht.
Dann doch Makro
Ok, vielen Dank für ihre schnelle Antwort!
Ich hatte nur gedacht, dass es vielleicht irgendeinen anderen Weg gibt, dies zu realisieren! Ginge es über "rename" - aber da kann ich immer nur auf eine Spalte zugreifen bzw. umkodieren...
Dann werde ich das Problem doch über ein Makro lösen!
RENAME in Makroschleife
%local i z;
length
%do i=1 %to 3;
%do z= 0 %to 38;
namealt1&i._t&z
%end;
%end;
8 ;
%mend define;
%macro rename;
%local i z;
rename
%do i=1 %to 3;
%do z= 0 %to 38;
namealt1&i._t&z = name1&i._t&z
%end;
%end;
;
%mend rename;
options mprint;
/* Testdaten erzeugen */
data datei;
%define
run;
/* Variablen umbenennen */
data test;
set datei;
%rename
run;
Zu diesem alten Thema habe
Zu diesem alten Thema habe ich eine aktuelle Frage:
Wie kann ich ohne viel Aufwand alle Variablen (außer eine - die ID) einer Datei umbennenen, so dass ich an den ursprünglichen Namen einen bestimmten Suffix anhänge? Die Anzahl der Variablen befindet sich zwischen 300 und 800, also im nicht mehr überschaubaren Bereich.
oder über
Die Variablen haben weder den gleichen Prefix noch sonstige gleiche Muster und sie sind numerisch oder strings, was das Problem erschwert. Man kann sich doch über sashelp.vcolumn die Spaltennamen holen aber dann muss man doch wieder jede einzelne Variable umbenennen! Oder sehe ich dass falsch? Hat jemand einen Tipp oder ein Makro zur Hand welches diese Fragestellung löst?
Danke
Mit SQL Makrovariable füllen
Hallo Chris86,
die Zuweisungen kannst Du gleich mit SQL gleich in eine Makrovariable packen und diese Makrovariable benutzt Du dann zum Umbenennen. Das Beispiel benutzt die Tabelle sashelp.class und statt id wird die Spalte Name nicht umbenannt.
select cats(Name ,"=", Name,"_09")
into :rename separated by " "
from dictionary.columns
where libname="SASHELP" and memname="CLASS" and UPCASE(name) ne "NAME"
;
quit;
Data class;
set sashelp.class;
rename &rename.;
run;
Schöne Grüße
Jan
Geht dieses Verfahren auch umgedreht?
Hallo Jan Heuer,
Sie hatten mir vor einem Jahr den oben stehenden Code empfohlen für das Umbennen von Spaltennamen - genauer, das Anhängen eines Suffixes. Nun wollte ich fragen geht das auch umgedreht?
Ich möchte nun alle Spaltennamen die fälschlicherweise mit '_08' enden umbennen auf einen anderen Suffix. Nun müsste ich erstmal alle Spalten selektieren und dann die Abfrage machen? Oder geht dies einfacher?
Mit besten Grüßen
Christian Knoll
Die Idee find ich gut, hatte
Die Idee find ich gut, hatte in der Zwischenzeit auch daran probiert. Kam aber nur bis zur folgenden Syntax, welche noch nicht ganz klapp:
set sashelp.vcolumn;
where libname = 'WORK' and memname = 'NEU';
RUN;
proc sql noprint;
select name INTO :altname1-:altname&sysmaxlong
FROM work.spaltendatei where name ne 'klinik_id';
QUIT;
* Test;
%PUT Variablenliste: *&altname1.*&altname2.*&altname3.;
%PUT &sqlobs;
%MACRO rename();
%DO i = 1 %to &sqlobs;
rename &&altname&i. = %trim(&&altname&i. , '_09');
%END;
%MEND;
data test;
set neu;
%rename;
run;
Ihren Vorschlag werde ich gleich ausprobieren!
Edit: Es klappt wie gewünscht! Vielen Dank.