[ 파워빌더.공통함수 - Token Parsing ]

 

 

검색해보니 토큰으로 되어 있는 글에는 없어서 올립니다.

두 가지 형태가 들어가 있구요.

첫번째는

ls_parm = 'A!B!C'

일 경우 ..

ls_val1 = gf_tokenize(ls_parm, '!')

하면..

ls_val1 에는 'A' 가 들어가 있고, ls_parm 에는 'B!C' 가 남게 됩니다.

 

두번재는

ls_val1 = gf_tokenize(ls_parm, '!', 1)

하면..

ls_val1 에는 첫번째 토큰( !) 까지 값인 A 가 남고, ls_parm 은 그대로 'A!B!C' 값을 가지고 있게 됩니다.

 

/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

global type gf_tokenize from function_object
end type

forward prototypes
global function string gf_tokenize (ref string as_source, string as_separator)
global function string gf_tokenize (string as_source, string as_separator, integer ai_position)
end prototypes

global function string gf_tokenize (ref string as_source, string as_separator);/*********************************************************************/
// Function : gf_tokenize()
//  Return Value 
//     String  Tokenize 결과물
//  Arguments
//   Pass By Reference String as_source
//   Pass By ReadOnly  String as_separator
/**********************************************************************/
integer li_pos
string  ls_retValue

if isnull( as_source ) or IsNull( as_separator ) THEN
 String ls_Null

 SetNull( ls_Null )
 Return ls_Null
END IF

li_pos = Pos( as_source, as_separator ) 
IF li_pos = 0 THEN
 ls_retValue = as_source
 as_source = ""
ELSE
 ls_retValue = Mid( as_source, 1, li_pos - 1 )
 as_source = Right( as_source, Len(as_source) - (li_pos + Len( as_separator ) -1 ) )
END IF

Return ls_retValue
end function

global function string gf_tokenize (string as_source, string as_separator, integer ai_position)
/*********************************************************************/
// Function : gf_Tokenizer
//  Return Value
//     String  Tokenize 결과물
//  Arguments
//   Pass By ReadOnly  String as_source
//   Pass By ReadOnly  String as_separator
//   Pass By ReadOnly  integer ai_position(음수일 경우는 오른쪽부터 찾는다.)
/**********************************************************************/
integer count, start_pos = 1, str_length, end_pos = 0
string  ret_value, ls_source, ls_left_source
STring  ls_temp_source
integer li_pos, li_end_pos = 0
boolean end_chk = false, null_chk = false
String ls_Null
SetNull( ls_Null )
ls_source = as_source
if isnull( as_source ) or IsNull( as_separator ) THEN Return ''
IF ai_position = 0 THEN null_chk = true
IF ai_position < 0 THEN //뒤에서 찾는다.
 For count = 1 to ABS(ai_position)
   IF count > 1 THEN ls_source  = left(ls_source, end_pos - 1) 
    //as_separator 가 있는 마지막 위치를 구한다.
    //lastPos는 한글일 경우에도 1byte로 계산하므로, do loop을 이용해서 구한다.
    ls_temp_source = ls_source
    do
     li_pos = Pos( ls_temp_source, as_separator )
      If li_pos > 0 THEN
      li_end_pos += li_pos
       ls_temp_source  = mid(ls_temp_source, li_pos + Len(as_separator))
     END IF
    loop until(li_pos = 0)
   end_pos = li_end_pos
    IF end_pos = 0 and count < ai_position then
    null_chk = true
     exit
   ELSEIF end_pos = 0  THEN
   start_pos  = 1
   ELSE
   start_pos  = end_pos + Len(as_separator)  
   END IF  
 NEXT
 if null_chk then
    ret_value = ls_Null
 else
   ret_value = mid(ls_source, start_pos)
 end IF
ELSE //앞에서 찾는다..
 for count = 1 to ai_position
   IF count > 1 THEN ls_source  = mid(ls_source, end_pos + Len(as_separator))
   end_pos = pos(ls_source, as_separator, 1)
   IF end_pos = 0 and count < ai_position THEN
  null_chk = true
  exit
   ELSEIF end_pos = 0 THEN
  ls_left_source = ls_source
   ELSE
  ls_left_source = left(ls_source, end_pos - 1)
   END IF
 next
 if null_chk then
    ret_value = ls_Null
 else
   ret_value = ls_left_source
 end if
END IF
if isnull(ret_value) then ret_value = ''
return ret_value
end function

Posted by 농부지기
,