2016-08-10 5 views
0

Ich habe eine Zeichenkette, die irgendwo ein Wort in Großbuchstaben enthält. Ich möchte dieses eine Wort in eine neue Variable mit SAS extrahieren.SAS ein Großbuchstabe innerhalb einer Zeichenkette finden

Ich denke, ich muss einen Weg finden, um nach einem Wort zu suchen, das zwei oder mehr Großbuchstaben enthält (da der Beginn eines Satzes mit einem Großbuchstaben beginnen würde).

dh Wie erstelle ich die Variable ‚Wort‘:

data example; 

    length txtString $50; 

    length word $20; 

    infile datalines dlm=','; 

    input txtString $ word $; 

datalines; 

This is one EXAMPLE. Of what I need.,EXAMPLE 

THIS is another.,THIS 

etc ETC,ETC 

; 

run; 

Hoffnung jemand helfen kann und die Frage ist klar

Vielen Dank im Voraus

+0

gründen eine for-Schleife für die Länge der Zeichenfolge Verwenden Sie dann die Byte-Funktion, um nach Ascii-Werten in Großbuchstaben zu suchen – DCR

Antwort

0

eine Regex Betrachten/Ersetzen mit einem negativer Lookbehind, um zwei Arten von Übereinstimmungen einzuschließen:

  1. aufeinanderfolgende Großbuchstaben gefolgt von einem sp Ass mit mindestens zwei Zeichen (zum Titel Fälle am Anfang des Satzes vermeiden): (([A-Z ]){2,})
  2. aufeinanderfolgenden Großbuchstaben Worte gefolgt von einem Punkt mit mindestens zwei Zeichen: (Titel Fälle am Anfang des Satzes zu vermeiden): (([A-Z.]){2,})

CAVEAT: Diese Lösung funktioniert mit Ausnahme der I Artikel ist auch abgestimmt, die technisch eine gültige Übereinstimmung ist, da es auch ein All-Großbuchstaben-Wort ist. Als einziger Typ in englischer Sprache sollten Sie einen tranwrd() Ersatz für solch einen speziellen Fall in Erwägung ziehen. In der Tat stimmt diese Lösung mit ALLEN Großbuchstaben überein.

data example; 
    length txtString $50; 
    length word $20; 
    infile datalines dlm=','; 
    input txtString $ word $; 
datalines; 
This is one EXAMPLE. Of what I need.,EXAMPLE 
THIS is another.,THIS 
etc ETC,ETC 
; 
run; 

data example; 
    set example; 
    pattern_num = prxparse("s/(?!(([A-Z ]){2,})|(([A-Z.]){2,})).//"); 
    wordextract = prxchange(pattern_num, -1, txtString); 

    wordextract = tranwrd(wordextract, " I ", ""); 
    drop pattern_num; 
run; 

txtString        word  wordextract 
This is one EXAMPLE. Of what I need. EXAMPLE EXAMPLE 
THIS is another.      THIS  THIS 
etc ETC         ETC  ETC 
0

SAS hat einen prxsubstr() Funktionsaufruf, der die Startposition und die Länge einer Teilkette findet, die innerhalb einer bestimmten Zeichenfolge, die einen vorgegebenen RegexMuster einstimmt. Hier ist eine Probenlösung, die prxsubstr() Funktionsaufruf mit:

data solution; 
    set example; 

    /* Build a regex pattern of the word to search for, and hang on to it */ 
    /* (The regex below means: word boundary, then two or more capital letters, 
    then word boundary. Word boundary here means the start or the end of a string 
    of letters, digits and/or underscores.) */ 
    if _N_ = 1 then pattern_num = prxparse("/\b[A-Z]{2,}\b/"); 
    retain pattern_num; 

    /* Get the starting position and the length of the word to extract */ 
    call prxsubstr(pattern_num, txtString, mypos, mylength); 

    /* If a word matching the regex pattern is found, extract it */ 
    if mypos ^= 0 then word = substr(txtString, mypos, mylength); 
run; 

SAS prxsubstr() Dokumentation: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002295971.htm

Regex Wortgrenze Info: http://www.regular-expressions.info/wordboundaries.html

Verwandte Themen