📄 dbsearch.pro
字号:
pro dbsearch,type,svals,values,good, FULLSTRING = fullstring, COUNT = count;+; NAME:; DBSEARCH; PURPOSE:; Subroutine of DBFIND() to search a vector for specified values;; CALLING SEQUENCE:; dbsearch, type, svals, values, good, [ /FULLSTRING, COUNT = ] ;; INPUT: ; type - type of search (output from dbfparse); svals - search values (output from dbfparse); values - array of values to search;; OUTPUT:; good - indices of good values;; OPTIONAL INPUT KEYWORD:; /FULLSTRING - By default, one has a match if a search string is ; included in any part of a database value (substring match). ; But if /FULLSTRING is set, then all characters in the database; value must match the search string (excluding leading and ; trailing blanks). Both types of string searches are case; insensitive.; OPTIONAL OUTPUT KEYWORD:; COUNT - Integer scalar giving the number of valid matches; SIDE EFFECTS:; The obsolete system variable !ERR is set to number of good values; REVISION HISTORY:; D. Lindler July,1987; Converted to IDL V5.0 W. Landsman September 1997; Added COUNT keyword, deprecate !ERR W. Landsman March 2000;-;----------------------------------------------------------- On_error,2 svals = strupcase(svals);; determine data type of values to be searched; s=size(values) & datatype=s[s[0]+1] & nv = N_elements(values);; convert svals to correct data type; nvals = type>2 if datatype NE 7 then sv = replicate(values[0],nvals) else $ sv = replicate(' ',nvals) On_ioerror, BADVAL ;Trap any type conversions sv[0]= svals[0:nvals-1] On_ioerror, NULL sv0=sv[0] & sv1=sv[1];; -----------------------------------------------------------; STRING SEARCHES (Must use STRPOS to search for substring match);if datatype EQ 7 then begin valid = bytarr(nv) values = strupcase(values) case type of 0: if keyword_set(FULLSTRING) then $ ;Exact string match? valid = strtrim(values,2) EQ strtrim(sv0,2) else $ valid = strpos(values,strtrim(sv0,2)) GE 0 ;substring search -1: valid = values GE sv0 ;greater than -3: valid = (values GE sv0) and (values LE sv1) ;in range -4: valid = strtrim(values) NE '' ;non zero (i.e. not null) -5: message, $ ;Tolerance value ' Tolerance specification for strings is not valid' else: begin sv = strtrim(sv,2) if keyword_set(FULLSTRING) then begin values = strtrim(values,2) for ii = 0l,type-1 do valid = (values EQ sv[ii]) or valid endif else begin for ii=0L,type-1 do begin ;within set of substring valid = (strpos(values,sv[ii]) GE 0) or valid endfor endelse end endcase good = where(valid, count) returnend;;---------------------------------------------------------------------; ALL OTHER DATA TYPEScase type of 0: good = where( values EQ sv0, count ) ;value=sv0 -1: good = where( values GE sv0, count ) ;value>sv0 -2: good = where( values LE sv1, count ) ;value<sv1 -3: begin ;sv0<value<sv1 if sv1 lt sv0 then begin temp=sv0 sv0=sv1 sv1=temp end good=where((values GE sv0) and (values LE sv1), count) end -5: begin ;sv1 is tolerance minv=sv0-abs(sv1) maxv=sv0+abs(sv1) good=where( (values GE minv) and (values LE maxv), count) end -4: good=where(values, count) ;non-zero else: begin ;set of values count=0 ;number found for i=0L,type-1 do begin ;loop on possible values g = where( values EQ sv[i], Ng) if Ng gt 0 then begin if count eq 0 then good=g else good=[good,g] count = count + Ng endif end !err=count if count EQ 0 then good = intarr(1)-1 ;Make sure good is defined endendcasereturnBADVAL: !ERR=-2 ;Illegal search value suppliedreturnend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -