CoDe SAS German

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-white.png

Our biggest data and AI event of the year.

Don’t miss the livestream kicking off May 7. It’s free. It’s easy. And it’s the best seat in the house.

Join us virtually with our complimentary SAS Innovate Digital Pass. Watch live or on-demand in multiple languages, with translations available to help you get the most out of every session.

 

Register now!

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