【SAP】 ABAP 字符串處理


  • 去除前導零
    DATA lv_char1 TYPE c LENGTH 10.
    lv_char1 = '0000021211'.
    **********************************************************************方式1 使用shift
    SHIFT lv_char1 LEFT DELETING LEADING '0'.
    write:/ lv_char1.
    **********************************************************************方式2 使用CONVERSION_EXIT_ALPHA_OUTPUT
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
         EXPORTING
       input  = lv_char1
         IMPORTING
       output = lv_char1.
    WRITE:/ lv_char1.
    **********************************************************************方式3 使用表達式
    lv_char1 = |{ lv_char1 ALPHA = out }|.
    WRITE:/ lv_char1.
    
  • 新增前導零
    DATA lv_char1 TYPE c LENGTH 10.
    lv_char1 = '0000021211'.
    DATA lv_char1 TYPE c LENGTH 10.
    lv_char1 = '21211'.
    WRITE:/ lv_char1.
    **********************************************************************方式1 CONVERSION_EXIT_ALPHA_INPUT
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
       EXPORTING
        input  = lv_char1
       IMPORTING
        output = lv_char1.
    WRITE:/ lv_char1.
    **********************************************************************方式2 
    lv_char1 = |{ lv_char1 ALPHA = IN }|.
    WRITE:/ lv_char1.
    
  • 拆分字符串 SPLIT
    • split 將字符傳dobj按照特定字符sep進行拆分
      SPLIT dobj AT sep INTO { {result1 result2 [...]} | {TABLE result_tab} }  [IN {CHARACTER|BYTE} MODE]. 
      
  • 截取字符串 SHIFT
    • shift dobj up to substr [mode]
      查找字符串中substr的位置,並向左截取或者向右截取字符串
    • shift dobj [by n places] [mode] mode可以為left和right
      字符串向左或者向右移動n個字符,如果n大於字符串的長度,則結果為空值
    • shift dobj { {LEFT DELETING LEADING} | {RIGHT DELETING TRAILING} } str
      把字符串中前的(LEFT)或者后的(RIGHT)的字符str都去掉
  • 字符替換 REPLACE
    • 關鍵字寫法
      • replace oldStr in fullStr with newStr 默認是只替換匹配到的第一個字符
      • replace [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] oldSubStr in fullString with newSubStr.
      • REPLACE SECTION [OFFSET off] [LENGTH len] OF dobj WITH new [IN {CHARACTER|BYTE} MODE].
      • REPLACE {str1} WITH {str2} INTO {c} [LENGTH {l}] 該寫法已過時
      • 實例代碼
        data lv_str type string.
        data:lv_chr1 type c LENGTH 100,
        lv_chr2 type c length 100.
        			  
        lv_chr2 = '13%-一般產品-騰訊雲服務'.
        replace  '-' in lv_chr2 with ''.
        write:/ lv_chr2.  "13%一般產品-騰訊雲服務
        lv_chr2 = '13%-一般產品-騰訊雲服務'.
        replace all occurrences of '-' in lv_chr2 with ''.
        write:/ lv_chr2. "13%一般產品騰訊雲服務
        replace section offset 3 length 4 of lv_chr2 with 'test'.
        write:/ lv_chr2. "13%test騰訊雲服務
        
    • 函數寫法
      • 可以在部分操作位中使用,減少中間變量的使用
      • replace( val = text [off = off] [len = len] with = new )
      • replace(val = text {sub = substring}|{regex = regex} with = new [case = case] [occ = occ] )
      • 實例代碼:
        lv_chr2 = '13%-一般產品-技術'.
        *replace section offset 3 length 4 of lv_chr2 with 'test'.
        write:/ replace( val = lv_chr2
        		   off = 3
        		   len = 4
        		   with = 'test'). "13%test技術
        			  
        lv_chr2 = '13%-一般產品-技術'.
        *replace all occurrences of '-' in lv_chr2 with ''.
        write:/ replace( val = lv_chr2
        		   sub = '-'
        		   with = ''
                         occ = 0 )."13%一般產品技術 occ 可以是正數也可以為負數,0標識全部替換
        
  • 大小寫轉換
    • 函數寫法
      • to_upper(string)
      • to_lower(string)
    • 關鍵字寫法
      • translate str to {UPPER|LOWER} CASE
    • 實例代碼
      		  lv_chr1 = 'abc001'.
      		  translate lv_chr1 to upper case.
      		  write:/ lv_chr1.
      		  write:/ to_lower( lv_chr1 ).
      		  translate lv_chr1 to lower case.
      		  write:/ lv_chr1.
      		  write:/ to_upper( lv_chr1 ).
      
  • 拼接字符串
    • 關鍵字 CONCATENATE
      • CONCATENATE {dobj1 dobj2 ...}|{LINES OF itab} INTO result [IN {CHARACTER|BYTE} MODE] [SEPARATED BY sep] [RESPECTING BLANKS].
    • &&字符
    • 字符串模板
    • 區別
      • 使用concatenate 會忽略 需要拼接字符串的尾部空格
      • 使用字符串操作符會忽略所拼接字符串的尾部空格,被拼接的第二個字符串頭部如果有多個空格,則會合並成一個
      • 使用字符串模板則會去除所有拼接字符的尾部空格
    • 實例代碼
      		  data lv_str type string.
      		  data:lv_chr1 type c LENGTH 100,
      		       lv_chr2 type c length 100.
      		  
      		  lv_chr1 = '  abba  '.
      		  lv_chr2 = '  dfsf  '.
      		  
      		  CONCATENATE lv_chr1 lv_chr2 into data(lv_chr3) separated by ': '.
      		  write:/ lv_chr3.
      		  lv_chr3 = lv_chr1 && ': ' && lv_chr2.
      		  write:/ lv_chr3.
      		  write:/ |{ lv_chr1 }:{ lv_chr2 }|.
      
  • 壓縮字符
    • 關鍵字 CONDENSE
      • condense string [no-gaps]. 沒有no-gaps時,會將首尾的空格移除並將字符串中間的多個空格壓縮成1個,如果使用了no-gaps則刪除所有空格。
    • 函數 CONDENSE
      • condense( [val =] text [del = del] [from = from] [to = to] )
        如果del不為空,則字符串中已del開頭和結尾的部分都會刪除,如果為空,則不會有刪除。
        如果from有值,則會將字符串中跟from值匹配的子字符替換為to的第一個字符。
        del、from、to 的默認值都是空格。
    • 實例代碼
      		  data lv_str type string.
      		  data:lv_chr1 type c LENGTH 100,
      		       lv_chr2 type c length 100.
      		  lv_chr1 = '  ERROR\  處理出錯  \  MSG  \錯誤  '.
      		  
      		  condense lv_chr1 .
      		  write:/ lv_chr1. "ERROR\ 處理出錯 \ MSG \錯誤
      		  
      		  condense lv_chr1 no-gaps.
      		  write:/ lv_chr1. "ERROR\處理出錯\MSG\錯誤
      		  
      		  lv_chr1 = '  ERROR\  處理出錯  \  MSG  \錯誤  '.
      		  write:/ condense( lv_chr1 ). "ERROR\ 處理出錯 \ MSG \錯誤
      		  
      		  write:/ condense( val = lv_chr1
      		                    to = ''). "ERROR\ 處理出錯 \ MSG \錯誤
      		  
      		  write:/ condense( val = lv_chr1
      		                    from = 'ERROR'
      		                    to = 'ERR'). "E\ 處理出錯 \ MSG \錯誤
      
  • 查找字符串
    • 函數FIND
    • 關鍵字 FIND
      • 語法
        			   FIND [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] pattern IN [SECTION [OFFSET off] [LENGTH len] OF] dobj [IN {CHARACTER|BYTE} MODE] [find_options]
        
      • substr 不能為空字符
      • find關鍵字的效率要高於操作符 cs
      • 關鍵字 serch 已經被標記為過時的寫法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM