Umbenennung von Spaltennamen über Schleife(n)

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;

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

%macro define;
%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.

namealt._09 = namealt

oder über

rename namealt = namealt._09

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.

Proc sql ;
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:

data spaltendatei;
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.