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
Occasional Contributor
Beiträge: 8
Tipp: Validierung von alphanumerischen Werten mit SAS Informat + Regex

Hallo zusammen,

 

folgende Erkenntnis möchte ich mit der Community teilen (gibt es aber schon seit SAS 9.3).

Ist m.E. eine nützliche Sache.

 

Viele Grüße

Johannes Lang

 

 == Motivation ==

Man möchte Regeln für die Gültigkeitsprüfung von Zeichenketten formulieren, und zwar als Muster. Außerdem sollen diese Regeln separat von der Datenverarbeitungslogik gehalten werden, damit Domänenexperten diese pflegen können, ohne den Code ändern zu müssen.

== Vorgehen ==

Um Geschäftsregeln in SAS auszulagern, bieten sich oftmals SAS Formate an. Die Formatdefinitionen können außerhalb von SAS z.B. in einer CSV-Datei verwaltet und zur Laufzeit eingelesen werden.
Für das oben genannte Szenario lässt sich seit SAS 9.3 ein neues Feature nutzen: Die Angabe von regulären Ausdrücken innerhalb eines SAS Informats.
Die Idee dabei ist, die Regel für gültige bzw. ungültige Werte als regulärer Ausdruck zu formulieren, und alle gültigen bzw. ungültigen Werte auf einen einheitlichen Wert (1 bzw. 0) zu mappen, der dann im Programm abgefragt wird.

Beispiel für Informat-Definition:

   %*** Informat für die Validierung von RGB-Farbwerten ***;
   PROC FORMAT LIBRARY=Work;
      invalue validrgb
            '/^cx[0-9a-fA-F]{6}$/' (REGEXP) = 1
            OTHER = 0
      ;
   RUN;


Beispiel für Anwendung:

    %Macro test1;

       %LET l_sValue = black; /* Ungültige Zeichen */
       %LET l_sValue = cx000000; /* Gültiger Ausdruck */
       %LET l_sValue = cx0012345; /* Ausdruck zu lang */

       %IF %SYSFUNC(inputn(&l_sValue., validrgb.)) EQ 1 %THEN %DO;
          %PUT *** Valid value;
       %END;
       %ELSE %DO;
          %PUT *** Invalid value;
       %END;

    %Mend;
    %test1;



== Nutzung im Kontext des HMS Parameterprüfungsframeworks ==

* Entwickelt von Andreas Bachert (HMS Analytical Software), um Parameterprüfungen metadatengestützt durch ein allgemeines Prüfmacro durchführen zu können.
* Wird auch von mir genutzt, bei Interesse bitte melden


=== Steuertabelle OPTIONS vorbereiten ===

 

Hinweise:

  • Der Parametertyp FMT_VALUE besagt, dass die gültigen Werte durch ein (In-)Format definiert sind.
  • Wie das (In-)Format heißt steht in PARM_FMTNAME_<ParamName>,
  • wie es angewendet werden soll steht in PARM_FMTFUNCTION_<ParamName>,
  • und was der Code für ungültige Werte ist steht in PARM_INVALIDVALUE_<ParamName>.
  • Weitere hier nicht aufgeführte Parametertypen sind NUM_RANGE (numerische Werte in einem bestimmten Bereich), ALPHA_LIST (vordefinierte Liste von Strings).
Name Value
PARM_NAME_LICHTGRAU g_sLichtGrau
PARM_TYPE_LICHTGRAU FMT_VALUE
PARM_DEFAULT_LICHTGRAU cxc0c0c0
PARM_FMTNAME_LICHTGRAU validrgb
PARM_FMTFUNCTION_LICHTGRAU INPUTN
PARM_INVALIDVALUE_LICHTGRAU 0
PARM_DESCR_LICHTGRAU Lichtgrau für Dashboards
PARM_MISSINGALLOWED_LICHTGRAU 0
PARM_NAME_HELLGRAU g_sHellGrau
PARM_TYPE_HELLGRAU FMT_VALUE
PARM_DEFAULT_HELLGRAU cx969696
PARM_FMTNAME_HELLGRAU validrgb
PARM_FMTFUNCTION_HELLGRAU INPUTN
PARM_INVALIDVALUE_HELLGRAU 0
PARM_DESCR_HELLGRAU Hellgrau für Dashboards
PARM_MISSINGALLOWED_HELLGRAU 0



=== Aufruf des Prüfmacros ===

 

Hinweise:

  • Das Prüfmacro %CheckAllParamsInList konsultiert anhand der übergebenen Macrovariablennamen die obige Steuertabelle OPTIONS und wendet die dort hinterlegten Gültigkeitsprüfungen an.
  • Beim ersten erkannten ungültigen Wert wird eine formatierte Fehlermeldung ausgegeben, sowohl ins SAS-Log als auch in eine konfigurierbare Tabelle. Der Meldungstext ist ebenfalls über eine eigene Steuertabelle konfigurierbar.

 

   %CheckAllParamsInList     (p_sParamNames           = %STR(g_sLichtGrau~g_sHellGrau)
                           ,  p_sParamValues          =
                           ,  p_sDelimiter            = %STR(~)
                           ,  p_sVarParamsOK          = l_nParamCheckRC
                              );

   %IF %EVAL(&l_nParamCheckRC. NE 1) %THEN %DO;
      %LET _ERR_ = 1;
      %LET l_bMessageRegistered = 1;
      %GOTO EXIT;
   %END;


== Links ==

* Langston, Rick (2012): Using the New Features in PROC FORMAT, in: Proceedings of SAS Global Forum 2012.
* Liste der Farbcodes in SAS/GRAPH (pdf)