; ; Copyright (c) 1998, Forschungszentrum Juelich GmbH ICG-1 ; All rights reserved. ; Unauthorized reproduction prohibited. ; This software may be used, copied, or redistributed as long as it is not ; sold and this copyright notice is reproduced on each copy made. This ; routine is provided as is without any express or implied warranties ; whatsoever. ; ;+ ; NAME: ; replace_string ; ; PURPOSE: ; This function replaces in a given string or vector of strings all values by an other. Length or only one char didn't matter. ; It could also be used to delete a substring from a string. ; ; CATEGORY: ; PROG_TOOLS/STRINGS ; ; CALLING SEQUENCE: ; Result=replace_string(text,in_string,rep_string,[no_of_replaces=no_of_replaces],[pos=pos],[count=count]) ; ; INPUTS: ; text: the text where to replace some informations ; in_string: the search string ; rep_string: the string which should replace in_string ; ; KEYWORD PARAMETERS: ; no_of_replace: if set two a number, this means in text as many times of no_of_replace in_string is reaplced by rep_string ; pos: if set to a number the replacement starts at this string position ; count: this argument returns the number of replaces ; ; OUTPUTS: ; Result is the new text ; ; EXAMPLE: ; help,replace_string('Dies ist ein Test',' ','_') ; <Expression> STRING = 'Dies_ist_ein_Test' ; help,replace_string('Dies ist ein Test',' ','_',pos=5) ; <Expression> STRING = 'Dies ist_ein_Test' ; help,replace_string('Dies ist ein Test',' ','_',pos=5,no=1) ; <Expression> STRING = 'Dies ist_ein Test' ; help,replace_string('Dies ist ein Test','ist','ist') ; <Expression> STRING = 'Dies ist ein Test' ; help,replace_string('Dies ist ein Test, ist ein','ist','ist nicht') ; <Expression> STRING = 'Dies ist nicht ein Test, ist nicht ein' ; help,replace_string('\\\\\\\\\','\','/') ; <Expression> STRING = '/////////' ; help,replace_string('["..\idl_html\idl_work_cat.htm"]','cat','cat_org') ; <Expression> STRING = '["..\idl_html\idl_work_cat_org.htm"]' ; print,replace_string(['12:33:00','12:33:00','12:33:00'],':',') ; 123300 123300 123300 ; print,replace_string(['12:33:00','12:33:00','12:33:00'],':',',pos=5) ; 12:3300 12:3300 12:3300 ; print,replace_string( 'asdf___ertz_j','__', ') ; asdf_ertz_j ; print,replace_string(['12:33:00','12:33:00','12:33:00'],':',',pos=5,count=c),c ; 12:3300 12:3300 12:3300 ; 3 ; print,replace_string(['12:33:00','12:33:00','12:33:00'],':',',count=c),c ; 123300 123300 123300 ; 6 ; ; ; MODIFICATION HISTORY: ; Written by: R.Bauer (ICG-1) , 1998-Sep-06 ; 1998-09-26 bug removed with start_pos and a vector of strings ; 1998-09-26 special replacement include if a sign should be replaced by an other by n times ; 1999-09-07 bug removed with replacing '___' by '_' ; 1999-10-01 count added ; 2000-03-08 bug with no_of_replaces removed ; if text is an array no_of_replaces is used for each element ; 2001-02-13 Loop in LONG ; 2004-06-03 added a test if submitted parameters have values ;- FUNCTION replace_string,text,in_string,rep_string,pos=pos,no_of_replaces=no_of_replaces,count=count_n_replace IF N_PARAMS() LT 3 THEN BEGIN ; MESSAGE,call_help(),/cont RETURN,' ENDIF If n_elements(text) eq 0 or n_elements(in_string) eq 0 or n_elements(rep_string) eq 0 then begin MESSAGE,/cont, 'problem by passig parameters, please check the input data variables' RETURN,' endif counter=0 count_n_replace=0 IF N_ELEMENTS(no_of_replaces) GT 0 THEN number=no_of_replaces ELSE number=1E+30 length_in_string=STRLEN(in_string) length_rep_string=STRLEN(rep_string) ; Sonderfall, wenn genau 1 Zeichen der Lanege 1 durch 1 anderes Zeichen der Laenge 1 und n mal ersetzt werden soll ; Dieses Verfahren ist einfach schneller IF length_rep_string NE 0 THEN BEGIN IF length_in_string + length_rep_string EQ 2 AND number EQ 1E+30 THEN BEGIN new_text=BYTE(text) IF N_ELEMENTS(pos) EQ 0 THEN BEGIN change=WHERE(new_text EQ ((BYTE(in_string))[0]),count_change) IF count_change GT 0 THEN new_text[change]=(BYTE(rep_string))[0] ENDIF ELSE BEGIN change=WHERE(new_text[pos:*] EQ ((BYTE(in_string))[0]),count_change) IF count_change GT 0 THEN new_text[pos+change]=(BYTE(rep_string))[0] ENDELSE count_n_replace=count_change RETURN,STRING(new_text) ENDIF ENDIF ; alle anderen Faelle werden so behandelt IF N_ELEMENTS(pos) EQ 0 THEN start_pos=0 ELSE start_pos=pos n_text=N_ELEMENTS(text)-1 FOR i=0L,n_text DO BEGIN counter=0 new_text=text[i] IF STRPOS(new_text,in_string) NE -1 AND in_string NE rep_string THEN BEGIN pos_in_string=1 text_length=STRLEN(new_text) WHILE pos_in_string NE -1 AND counter LT number DO BEGIN pos_in_string=STRPOS(new_text,in_string,start_pos) IF pos_in_string GT -1 THEN BEGIN count_n_replace=count_n_replace+1 new_text=STRMID(new_text,0,pos_in_string)+rep_string+STRMID(new_text,pos_in_string+length_in_string,text_length) start_pos=pos_in_string+length_rep_string ENDIF counter=counter+1 ENDWHILE if n_elements(result) eq 0 then result=new_text else result=[result,new_text] IF N_ELEMENTS(pos) EQ 0 THEN start_pos=0 ELSE start_pos=pos ENDIF ELSE BEGIN if n_elements(result) eq 0 then result=new_text else result=[result,new_text] IF N_ELEMENTS(pos) EQ 0 THEN start_pos=0 ELSE start_pos=pos ENDELSE ENDFOR RETURN,result END