2017-10-04 3 views
0

J'essaie de trouver un moyen de supprimer l'initiale du milieu d'une chaîne contenant le prénom et l'initiale du milieu (l'exemple «Mary A» doit être «Mary»).Supprimer l'initiale du milieu mais pas le deuxième prénom de la chaîne

Cependant, je devrais garder le nom du milieu/second si c'était plus qu'un initial (exemple "Mary Ann" resterait "Mary Ann").

Une grande partie grâce,

Matt

Répondre

0

Voici un exemple de la façon de le faire en utilisant la substitution d'expression régulière. Je l'ai utilisé proc sql mais cela fonctionne également dans une étape de données:

data names; 
input name & $5.; 
cards; 
Aa A 
Aa Aa 
Aaa A 
; 
run; 

proc sql; 
    select prxchange('s/^(\w+)\s+\w\s*$/$1/',-1,name) from names; 
quit; 

Le regex est construit comme suit:

  • capture le premier mot
  • match un espace, un seul caractère, puis un nombre quelconque d'espaces de fin
  • Si l'expression entière est une correspondance, renvoyez uniquement le premier mot, sinon renvoyez la chaîne d'entrée entière sans la modifier.
1

Essayez d'utiliser la fonction scan:

data test; 
    input name $20.; 
    cards; 
    Mary A 
    Anthony B 
    Mary Ann 
    Anthony Bernard 
    ; 
run; 

data res; 
    set test; 
    if (length(scan(name,2))=1) then name=scan(name,1); 
run; 

En conséquence, vous obtenez:

Mary 
Anthony 
Mary Ann 
Anthony Bernard