2016-12-21 1 views
1

In sas, wie kann ich spezifisch das i-te Wort in einer Zeichenfolge ersetzen?So ersetzen Sie speziell das n-te Wort in einer Zeichenfolge in SAS

Lassen Sie uns sagen, dass ich eine Zeichenfolge wie dieses:

myString = 'aa cccc ddd aa aa 0.85645'; 

(= 6 Wörter), wo ich weiß nicht, die Länge jedes Wort, ich weiß nur, sie durch Leerzeichen getrennt sind.

wie kann ich ersetzen Sie den i-ten String mit etwas anderem wie

z.B. wenn i = 4 und ich möchte das Wort mit ‚bbbbb‘ ersetzen:

myNewString = 'aa cccc ddd bbbbb aa 0.85645'; 

ich für eine Funktion bin auf der Suche, die eine Art von einer Kombination aus scan(myString,4,' ') und tranwrd wäre.

Das Problem hier ist, dass ich sie nicht kombinieren kann, weil das erste Wort dasselbe und das vierte Wort sein kann, und deshalb kann ich nicht spezifisch ein tranwrd auf dem 4. Wort zielen. Ich kann find() auch nicht aus dem gleichen Grund verwenden.

Antwort

4

Anruf SCAN machen dies einfach.

38   data _null_; 
39   String = 'aa cccc ddd aa aa 0.85645'; 
40   call scan(string,4,p,l,' '); 
41   string2 = substrn(string,1,p-1)||'Dummy'||substrn(string,p+l); 
42   put _all_; 
43   run; 

String=aa cccc ddd aa aa 0.85645 p=13 l=2 string2=aa cccc ddd Dummy aa 0.85645 _ERROR_=0 _N_=1 
+1

Kühl. Anmerkung mit l für die Länge macht den Code ein wenig schwer zu lesen, da 'p + l' viel wie' p + 1' aussieht. :) – Tom

+0

Ja, aber wenn ich die Frage verstehe, kann man die Länge der Zeichenfolge vorher nicht wissen. Also, wir kennen den Wert von p und l nicht, weil er sich ändern kann. Also bevorzuge ich die Antwort von user667489. –

+0

@ D.O. Die Werte von P und L sind, was CALL SCAN zurückgibt. –

1

Hier ist eine Möglichkeit, dies zu tun. Regex könnte auch einen Blick wert sein.

data example; 
myString = 'aa cccc ddd aa aa 0.85645'; 
length myWord $32 t_myString $1000; 
myWord = 'Dummy'; 
do i = 1 by 1 while (myWord ne ''); 
myWord = scan(myString,i,' '); 
if i = 4 then myWord = 'bbbbb'; 
t_mystring = catx(' ',t_myString,myWord); 
end; 
myString = t_myString; 
drop myWord t_myString; 
run; 
+0

Ich denke, das ist die gute Antwort, denn myString kann eine beliebige Zeichenfolge sein. –

Verwandte Themen