1.概述
字符數(shù)據(jù)(又稱字串)指的是廣義的字符類型(包括C,N,D,T和String等類型)數(shù)據(jù)對(duì)象。對(duì)于字符串?dāng)?shù)據(jù)氧猬,ABAP提供了一些特有的操作語句背犯,這些操作在處理數(shù)據(jù)對(duì)象時(shí)不進(jìn)行類型轉(zhuǎn)換,一律照C類型對(duì)待盅抚。
2. 處理字符串?dāng)?shù)據(jù)
1.連接字符串漠魏,使用
CONCATENATE
CONCATENATE s1 ... sn INTO s_dest [SEPARATED BY sep].
該語句連接字串s1...sn并將結(jié)果賦給s_dest,其中s_dest也可以是s1...sn中的某個(gè)變量。選項(xiàng)SEPARATED BY 用于指定一個(gè)字串作為分隔符妄均,在構(gòu)成新字串時(shí)插入在s1...sn之間柱锹。如果連接后的長(zhǎng)度超過了目標(biāo)數(shù)據(jù)定義長(zhǎng)度,則把截?cái)噘x給c丛晦。如結(jié)果出現(xiàn)截?cái)嗲闆r奕纫,SY-SUBRC返回4,否則該值返回0.要避免截?cái)嗵躺常梢詫定義為String,該類型長(zhǎng)度自適應(yīng)隙笆。
REPORT z_data_manipulation.
DATA: s1(9) TYPE c VALUE 'Fristname',
s2(10) TYPE c VALUE 'Secondname',
s3(20),
sep(1) TYPE c VALUE '.'.
CONCATENATE s1 s2 INTO s3.
WRITE / s3.
CONCATENATE s1 s2 INTO s3 SEPARATED BY sep.
WRITE / s3.
2.拆分字符串锌蓄,使用
SPLIT
SPLIT s_source AT sep INTO s1...sn.
該語句在源字串中搜索分隔符sep,并根據(jù)該分割符將元字串拆成各個(gè)小串放到目標(biāo)字段s1 ... sn中撑柔,這些子串不包括分隔符瘸爽。與連接語句類型,如結(jié)果出現(xiàn)截?cái)嗲闆r铅忿,SY-SUBRC返回4剪决,否則該值返回0。如果源子串能夠拆分的子串多過指定數(shù)目檀训,則源子串最后剩余部分包括其后的分割符都將寫入最后一個(gè)子串柑潦,要避免這種情況,需要使用內(nèi)表進(jìn)行操作峻凫。
SPLIT s_source AT sep INTO TABLE itab.
REPORT z_data_manipulation.
DATA : text TYPE string,
itab TYPE TABLE OF string.
text = 'ABAP is a programming language'.
SPLIT text AT space INTO TABLE itab.
LOOP AT itab INTO text.
WRITE / text.
ENDLOOP.
語句LOOP AT用于循環(huán)輸出內(nèi)表的每一行數(shù)據(jù)渗鬼。
3.查找子串模式
在一個(gè)字符串中查找一個(gè)子字符串模式,使用SEARCH
語句
SEARCH c FOR str.
改語句在字段c中查找字符串str荧琼。如果找到譬胎,則將SY-SUBRC返回0差牛,SY-FDPOS返回字段c中該字符串的位置(從做算起的字節(jié)偏移量),否則將SY-SUBRC返回4堰乔。所謂模式是指要查找的字串不一定與str完全一致偏化,可以設(shè)定忽略或保留str末尾的空格,或利用通配符“*”擴(kuò)大其查找靈活性镐侯,由下列幾種模式:
- str 搜索str并忽略尾部空格
- .str. 搜索str夹孔,但是不忽略尾部空格
- *str 搜索以str結(jié)尾的單詞
- str* 搜索以str開始的單詞
REPORT z_string_search.
DATA string(30) TYPE c VALUE 'This is a testing sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.
SEARCH string FOR 'X'.
WRITE: / 'X', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string FOR 'itt '.
WRITE: / 'itt ',sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string FOR '.e .'.
WRITE: / '.e .', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string FOR '*e'.
WRITE: / '*e ', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string FOR 's*'.
WRITE: / 's*', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
4.替換字段內(nèi)容,使用REPLACE語句析孽。
REPLACE str1 WITH str2 INTO s_dest [LENGTH len].
該語句對(duì)字段s_dest進(jìn)行搜索搭伤,如果在其中出現(xiàn)了字符串str1,則用str2替換第一次出現(xiàn)的部分袜瞬。如果未指定長(zhǎng)度怜俐,則搜索整個(gè)s_dest。如果指定長(zhǎng)度len邓尤,則只搜索前l(fā)en個(gè)字節(jié)拍鲤。如果字段SY-SUBRC返回0,則說明已經(jīng)替換汞扎;非0則意味著未進(jìn)行替換季稳。
REPORT z_string_replace.
DATA name TYPE string.
name = 'Michael-Cheong'.
WHILE sy-subrc = 0.
REPLACE '-' WITH ' ' INTO name.
ENDWHILE.
WRITE / name.
5.確定字段長(zhǎng)度,不包括結(jié)尾空格澈魄,使用STRLEN景鼠,語句將操作數(shù)str作為字符數(shù)據(jù)類型處理,不考慮實(shí)際類型痹扇,也不進(jìn)行轉(zhuǎn)換
[COMPUTE] n = STRLEN( str ).
REPORT z_string_strlen.
DATA: text(24) TYPE c VALUE 'ABAP Language',
len TYPE i.
len = strlen( text ).
WRITE: / 'Length of', text, 'is', len.
6.其他操作
- SHIFT 將字符串整體或子串進(jìn)行位移
- CONDENSE 刪除字符串中的多余空格
- TRANSLATE 字符轉(zhuǎn)換铛漓,例如將ABC轉(zhuǎn)換為abc
- CONVERT TEXT 創(chuàng)建一個(gè)可以排序的格式
- OVERLAY 用一個(gè)字符串覆蓋另一個(gè)字符串
- WRITE TO 賦值時(shí),將忽略數(shù)據(jù)對(duì)象類型鲫构,將其視為字符類型數(shù)據(jù)
3. 字符數(shù)據(jù)比較
字符型邏輯表達(dá)式用于判斷兩個(gè)字符串之間的包含關(guān)系
運(yùn)算符 | 含義 |
---|---|
s1 CO s2 | 如果s1僅包含s2中的字符浓恶,則邏輯表達(dá)式為真 |
s1 CN s2 | 如果s1包含s2之外的其他字符,則邏輯表達(dá)式為真 |
s1 CA s2 | 如果s1包含任何一個(gè)s2中的字符结笨,則邏輯表達(dá)式為真 |
s1 NA s2 | 如果s1不包含s2的任何字符包晰,則邏輯表達(dá)式為真 |
s1 CS s2 | 如果s1包含字符串s2,則邏輯表達(dá)式為真 |
s1 NS s2 | 如果s1不包含字符串s2炕吸,則邏輯表達(dá)式為真 |
s1 CP s2 | 如果s1包含模式s2伐憾,則邏輯表達(dá)式為真 |
s1 NP s2 | 如果s1不包含模式s2,則邏輯表達(dá)式為真 |
CO,CN,CA,NA比較時(shí)要區(qū)分大小寫算途,并且尾部空格也在比較的范圍之內(nèi)塞耕;使用CS,NS,CP,NP比較時(shí)忽略尾部空格并且比較不區(qū)分大小寫。比較結(jié)束后嘴瓤,如果結(jié)果為真扫外,系統(tǒng)字段SY-FDPOS將給出s2在s1中偏移量信息莉钙。
REPORT z_string_replace.
DATA: s1 TYPE string,
s2 TYPE string.
s1 = 'SAP ABAP'.
s2 = 'ABAP'.
IF s1 CS s2.
WRITE: / s2, 'is in Position', sy-fdpos,
'of', s1, 'Stirng'.
ENDIF.
CP和NP被稱為模式比較邏輯表達(dá)式,意義在于可以使用通配符筛谚。
“*”用于替代任何字符串磁玉,“+”用于替代任何單個(gè)字符。
如需對(duì)大小寫或尾部空格進(jìn)行區(qū)分比較驾讲,需要將換碼字符“#”放到相應(yīng)的字符前蚊伞。下面列出可以使用“#”指定的功能:
- 大小寫字符,指定大小寫(如#A,#b)
- 通配符“”(輸入#)吮铭,將其轉(zhuǎn)回原意
- 通配符“+”(輸入#+)时迫,將其轉(zhuǎn)回原意
- 換碼符號(hào)本身(輸入##),將其轉(zhuǎn)回原意
- 字符串結(jié)尾的空格(輸入#_),指定比較結(jié)尾空格
3 定位操作子串
僅操作指定的部分子串谓晌。
s [+o][(1)]
其意義是對(duì)字段s從第o位開始(從0開始偏移)且長(zhǎng)度為1的部分執(zhí)行該語句操作掠拳。如果未指定長(zhǎng)度,則對(duì)字段s第o和結(jié)尾之間的所有位進(jìn)行處理纸肉。
REPORT z_string_replace.
DATA: f1(8) VALUE 'ABCDEFGH',
f2(20) VALUE '12345678901234567890'.
f2+6(5) = f1+3(5).
WRITE : / f1, / f2.
通常溺欧,必須將偏移量和長(zhǎng)度指定為無符號(hào)數(shù)。然而柏肪,一下情況中可以使用變量動(dòng)態(tài)指定:
- 用MOVE語句或賦值運(yùn)算符給字段賦值時(shí)
- 用WRITE TO語句向字段攜入值時(shí)
- 用ASSIGN將字段分配給字段符號(hào)時(shí)
- 用PERFORM將數(shù)據(jù)傳送給子程序時(shí)
對(duì)字符類型姐刁,數(shù)值文本字段,十六進(jìn)制字段烦味,日期和時(shí)間字段指定偏移量是有意義的聂使;類型F,I,P數(shù)值字段則不要使用指定偏移量。