LesezeichenAbonnierenRSS-Feed abonnieren
Fay123
Obsidian | Level 7

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!

5 ANTWORTEN 5
mfab
Quartz | Level 8

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

AndreasBachert
Calcite | Level 5

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

HeideTribius
Fluorite | Level 6

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;
jh_ti_bw
Obsidian | Level 7

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

Fay123
Obsidian | Level 7

Vielen Dank an alle!

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Diskussionsstatistiken
  • 5 Antworten
  • 5825 Aufrufe
  • 5 Kudos
  • 5 in Unterhaltung