Community deutschsprachiger SAS-Anwender und -Programmierer

Antworten
Dies ist eine offene Gruppe. Melden Sie sich an und klicken Sie auf die Schaltfläche „Gruppe beitreten“, um Mitglied zu werden und damit zu beginnen, Beiträge in dieser Gruppe zu veröffentlichen.
Highlighted
Contributor
Beiträge: 50
Ersetzen/Ändern

Gibt es in SAS eine ähnliche Funktion wie in Excel: Werte ersetzen bzw. ergänzen?

 

Eine Beispiel:

ich habe Werte wie

 

BIV1

BiV2

BIV3

BIV

BIV1_ABC

BIV2_ABC

BIV3_ABC..........

 

Diese Werte sollen umbenannt werden in

 

BIV1Y

BIV2Y

BIV3Y

BIVY

BIV1Y_ABC

BIV2Y_ABC

BIV3Y_ABC

 

Danke vorab!

Frequent Contributor
Beiträge: 130
Betreff: Ersetzen/Ändern
[ Bearbeitet ]

Hallo @Fay123,

 

je nachdem, wieviele Ersetzungen zu machen sind, könnte man das z.B. über eine Zuordnungstabelle lösen, die man an die Daten joined oder bei weniger Ersetzungen einfach mit der TRANWRD-Funktion, die ganze Wörter in einem String ersetzen kann.

 

Viele Grüße

Michael

Occasional Contributor
Beiträge: 6
Betreff: Ersetzen/Ändern
[ Bearbeitet ]

Ich sehe neben einem Join mit einer externen Tabelle noch mindestens zwei weitere effektive Wege, wie die 'Umbenennung' von statten gehen kann:

  1. Erzeugen eines Formates, das das mapping von altem zu neuem Namen übernimmt
  2. Verwenden von Regular Expressions
    • Diese Variante ist dann interessant, wenn es Regeln für die Umbenennung gibt
    • Dann muss man nicht jeden alten und neuen Wert selbst in irgendeiner Form benennen

 

Code für Variante 1:

PROC FORMAT LIB=WORK;
   VALUE $fmtNewNames
      "BIV1"      = "BIV1Y"
      "BIV2"      = "BIV2Y"
      "BIV3"      = "BIV3Y"
      "BIV"       = "BIVY"
      "BIV1_ABC"  = "BIV1Y_ABC"
      "BIV2_ABC"  = "BIV2Y_ABC"
      "BIV3_ABC"  = "BIV3Y_ABC"
   ;
RUN;

DATA _NULL_;
   LENGTH
      Vorher
      Nachher     $20
   ;

   Vorher   = "BIV";
   Nachher  = PUT (Vorher, $fmtNewNames.);
   PUT Vorher= Nachher=;

   Vorher   = "BIV1";
   Nachher  = PUT (Vorher, $fmtNewNames.);
   PUT Vorher= Nachher=;

   Vorher   = "BIV2_ABC";
   Nachher  = PUT (Vorher, $fmtNewNames.);
   PUT Vorher= Nachher=;

   Vorher   = "UNBEKANNT";
   Nachher  = PUT (Vorher, $fmtNewNames.);
   PUT Vorher= Nachher=;
RUN;

/* Ausgabe im Log: */
Vorher=BIV Nachher=BIVY
Vorher=BIV1 Nachher=BIV1Y
Vorher=BIV2_ABC Nachher=BIV2Y_ABC
Vorher=UNBEKANNT Nachher=UNBEKANNT

 

 

Code für Variante 2:

/* Angenommen die Regel lautet:
   -  Es kommen Werte, 
      -  die mit BIV beginnen 
      -  und danach 0 bis 1 Ziffer haben
      -  und danach
         -  enden
         -  oder ein Unterstrich und weitere Zeichen folgen
   -  Ergänze diese Werte um den Buchstaben Y
      -  bei 3-stelligen Werten am Ende
      -  sonst nach der ersten Ziffer
*/
DATA _NULL_;
   LENGTH
      oPattern       8
      sPattern       $100
      Vorher
      Nachher        $20
   ;

   /* Definieren des Such- und Ersetzungsmusters */
   sPattern    = 's/(BIV\d?)(_?)(.*)/$1Y$2$3/';

   /* Suchmuster validieren */
   oPattern    = PRXParse  (sPattern);

   Vorher   = "BIV";
   Nachher    = PRXChange (oPattern, 1, Vorher);
   PUT Vorher= Nachher=;

   Vorher   = "BIV_ABC";
   Nachher    = PRXChange (oPattern, 1, Vorher);
   PUT Vorher= Nachher=;

   Vorher   = "BIV1";
   Nachher    = PRXChange (oPattern, 1, Vorher);
   PUT Vorher= Nachher=;

   Vorher   = "BIV2ABC";
   Nachher    = PRXChange (oPattern, 1, Vorher);
   PUT Vorher= Nachher=;

   Vorher   = "BIV3_ABC";
   Nachher    = PRXChange (oPattern, 1, Vorher);
   PUT Vorher= Nachher=;

   Vorher   = "UNBEKANNT";
   Nachher    = PRXChange (oPattern, 1, Vorher);
   PUT Vorher= Nachher=;

RUN;

/* Ausgabe im Log: */
Vorher=BIV Nachher=BIVY
Vorher=BIV_ABC Nachher=BIVY_ABC
Vorher=BIV1 Nachher=BIV1Y
Vorher=BIV2ABC Nachher=BIV2YABC
Vorher=BIV3_ABC Nachher=BIV3Y_ABC
Vorher=UNBEKANNT Nachher=UNBEKANNT

 

 

Viele Grüße

Andreas

Occasional Contributor
Beiträge: 14
Betreff: Ersetzen/Ändern

hallo Fay,

 

mit index() kann man die Position eines Zeichens im String bestimmen.

 

viele Grüße. Heide

 

data test;
length wert $20;
        wert = 'BIV1'; output;
        wert = 'BiV2'; output;
        wert = 'BIV3'; output;
        wert = 'BIV'; output;
        wert = 'BIV1_ABC'; output;
        wert = 'BIV2_ABC'; output;
        wert = 'BIV3_ABC'; output;
run;
 
data daten (drop=pos);
        set test;
        pos = index(wert,"_");
        if pos then wert = cats(substr(wert,1,pos-1),"Y",substr(wert,pos));
                        else wert = cats(wert,"Y");
run;
Contributor
Beiträge: 26
Betreff: Ersetzen/Ändern

Hallo Fay123,

 

die Funktion PRXChange ist dafür geeignet:

data test;
  length wert $20;
  wert = 'BIV1'; output;
  wert = 'BiV2'; output;
  wert = 'BIV3'; output;
  wert = 'BIV'; output;
  wert = 'BIV1_ABC'; output;
  wert = 'BIV2_ABC'; output;
  wert = 'BIV3_ABC'; output;
run;
Data change;
  set test;
  wert_neu = PRXChange("s/(BIV\d*)(.*)/\1Y\2/i",1,Wert);
run;

Viele Grüße

Jan

Contributor
Beiträge: 50
Betreff: Ersetzen/Ändern

Vielen Dank an alle!