ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ABAP 怎樣判斷‘逗號’字符的位置

ABAP 怎樣判斷‘逗號’字符的位置

原创 Linux操作系统 作者:lorryhappy 时间:2009-03-19 20:23:48 0 删除 编辑
偶然之間,從別人處偷得如何找到字符串當中逗號位置的方法
DATA:  result_wa TYPE match_result,
      result_tab TYPE match_result_tab.

DATA: text(140) TYPE c
     VALUE
     'No. 128, Gong 5th Rd.,   Longtan Township, Taoyuan County,325,TW'.

FIND ALL OCCURRENCES OF REGEX ',' IN text RESULTS result_tab.

那么,如何找到這個字符串當中的空格位置呢?開始,嘗試使用下面的語句,發現會造成ABAP DUMP
FIND ALL OCCURRENCES OF REGEX '  '  IN Text RESULTS result_tab.

上網查詢了REGEX單詞的意思,原來是“正則表達式”的含義,因為正則表達式中無法識別 ' ' 字符所以出現了ABAP DUMP。
於是仿照找到的資料修改語句,就可以實現了
FIND ALL OCCURRENCES OF REGEX '\s' IN Text RESULTS result_tab.

再次感嘆ABAP語言的強大,其實很多高級語言裡的功能ABAP都有集成,隨帖附上我找到的《深入淺出正則表達式》,雖然不太常用,但是字符串操作在FORM和WRITE輸出當中還是會涉及到的~

*示例代碼一 用於FROM中不被逗號和空格截斷
*拆分地址字段
data:l_text(141) type c,
     l_temp(141) type c,
     result_wa type match_result,
     result_tab type match_result_tab,
     lt_space(70) occurs 0 with header line,
     count type i,
     num type i.

condense:t_header-address1,
         t_header-address2,
         t_header-address3.

clear:l_text,l_temp,result_wa,count,num.
refresh:result_tab[],lt_space[].
l_text = t_header-address1.
*將空格轉換為,并確定所有,&空格位置
split l_text at space into table lt_space.
loop at lt_space.
  concatenate l_temp lt_space ',' into l_temp.
endloop.
find all occurrences of regex ',' in l_temp
results result_tab.
*根據得到的,&空格位置處理字符串
count = strlen( t_header-address1 ).
if count > 56.
  loop at result_tab into result_wa.
    if result_wa-offset < 56.
      continue.
    else.
      sy-tabix = sy-tabix - 1.
      read table result_tab index sy-tabix into result_wa.
      num = result_wa-offset.
      exit.
    endif.
  endloop.
*得到第一行最後一個,或空格的位置,根據位置拆分字段
  if num = 55.
    p1_ad1 = l_text+0(56).
    p2_ad1 = l_text+56(56).
  else.
    num = num + 1.
    p1_ad1 = l_text+0(num).
    count = 112 - num + 1.
    p2_ad1 = l_text+num(count).
  endif.
else.
  p1_ad1 = l_text+0(56).
endif.

clear:l_text,l_temp,result_wa,count,num.
refresh:result_tab[],lt_space[].
l_text = t_header-address2.
*將空格轉換為,并確定所有,&空格位置
split l_text at space into table lt_space.
loop at lt_space.
  concatenate l_temp lt_space ',' into l_temp.
endloop.
find all occurrences of regex ',' in l_temp
results result_tab.
*根據得到的,&空格位置處理字符串
count = strlen( t_header-address2 ).
if count > 56.
  loop at result_tab into result_wa.
    if result_wa-offset < 56.
      continue.
    else.
      sy-tabix = sy-tabix - 1.
      read table result_tab index sy-tabix into result_wa.
      num = result_wa-offset.
      exit.
    endif.
  endloop.
*得到第一行最後一個,或空格的位置,根據位置拆分字段
  if num = 55.
    p1_ad2 = l_text+0(56).
    p2_ad2 = l_text+56(56).
  else.
    num = num + 1.
    p1_ad2 = l_text+0(num).
    count = 112 - num + 1.
    p2_ad2 = l_text+num(count).
  endif.
else.
  p1_ad2 = l_text+0(56).
endif.

clear:l_text,l_temp,result_wa,count,num.
refresh:result_tab[],lt_space[].
l_text = t_header-address3.
*將空格轉換為,并確定所有,&空格位置
split l_text at space into table lt_space.
loop at lt_space.
  concatenate l_temp lt_space ',' into l_temp.
endloop.
find all occurrences of regex ',' in l_temp
results result_tab.
*根據得到的,&空格位置處理字符串
count = strlen( t_header-address3 ).
if count > 56.
  loop at result_tab into result_wa.
    if result_wa-offset < 56.
      continue.
    else.
      sy-tabix = sy-tabix - 1.
      read table result_tab index sy-tabix into result_wa.
      num = result_wa-offset.
      exit.
    endif.
  endloop.
*得到第一行最後一個,或空格的位置,根據位置拆分字段
  if num = 55.
    p1_ad3 = l_text+0(56).
    p2_ad3 = l_text+56(56).
  else.
    num = num + 1.
    p1_ad3 = l_text+0(num).
    count = 112 - num + 1.
    p2_ad3 = l_text+num(count).
  endif.
else.
  p1_ad3 = l_text+0(56).
endif.


*示例代碼二
*split address   20090218
    data:l_length type i,
         l_length1 type i,
         l_length2 type i,
         l_length3 type i,
         l_length5 type i,
         result_wa1 type match_result,
         result_tab1 type match_result_tab.

    l_length1 = strlen( t_header-street ).
    if l_length1 > 46.
      find all occurrences of regex ',' in t_header-street
      results result_tab1.

*start 20090219
      l_length = 45.
      do.
        if l_length = -1.
          exit.
        endif.
        if t_header-street+l_length(1) = ' '.
          l_length = l_length + 1.
          exit.
        else.
          l_length = l_length - 1.
        endif.
      enddo.
*end 20080219
      loop at result_tab1 into result_wa1.
        if result_wa1-offset < 46.
          l_length5 =  result_wa1-offset + 1.
        else.
          exit.
        endif.
      endloop.
      if l_length5 > l_length and l_length >= 0.
        l_length2 =  l_length.
        l_length1 = l_length1 - l_length2.
        g_street1 = t_header-street(l_length2).
        g_street2 = t_header-street+l_length2(l_length1).
      else.
*start 20080219
        g_street1 = t_header-street(l_length).
        l_length1 = l_length1 - l_length.
*end 20080219
        g_street2 = t_header-street+l_length(l_length1).
      endif.
    else.
      g_street1 = t_header-street.
    endif.
    clear: l_length1.

[ 本帖最后由 lorryhappy 于 2009-3-24 13:44 编辑 ]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21122155/viewspace-578420/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-03-15

  • 博文量
    7
  • 访问量
    14759