1.概述
字符数据(又称字串)指的是广义的字符类型(包括C,N,D,T和String等类型)数据对象。对于字符串数据,ABAP提供了一些特有的操作语句,这些操作在处理数据对象时不进行类型转换,一律照C类型对待。
2. 处理字符串数据
1.连接字符串,使用
CONCATENATE
CONCATENATE s1 ... sn INTO s_dest [SEPARATED BY sep].
该语句连接字串s1...sn并将结果赋给s_dest,其中s_dest也可以是s1...sn中的某个变量。选项SEPARATED BY 用于指定一个字串作为分隔符,在构成新字串时插入在s1...sn之间。如果连接后的长度超过了目标数据定义长度,则把截断赋给c。如结果出现截断情况,SY-SUBRC返回4,否则该值返回0.要避免截断,可以将将c定义为String,该类型长度自适应。
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,并根据该分割符将元字串拆成各个小串放到目标字段s1 ... sn中,这些子串不包括分隔符。与连接语句类型,如结果出现截断情况,SY-SUBRC返回4,否则该值返回0。如果源子串能够拆分的子串多过指定数目,则源子串最后剩余部分包括其后的分割符都将写入最后一个子串,要避免这种情况,需要使用内表进行操作。
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用于循环输出内表的每一行数据。
3.查找子串模式
在一个字符串中查找一个子字符串模式,使用SEARCH
语句
SEARCH c FOR str.
改语句在字段c中查找字符串str。如果找到,则将SY-SUBRC返回0,SY-FDPOS返回字段c中该字符串的位置(从做算起的字节偏移量),否则将SY-SUBRC返回4。所谓模式是指要查找的字串不一定与str完全一致,可以设定忽略或保留str末尾的空格,或利用通配符“*”扩大其查找灵活性,由下列几种模式:
- str 搜索str并忽略尾部空格
- .str. 搜索str,但是不忽略尾部空格
- *str 搜索以str结尾的单词
- 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.替换字段内容,使用REPLACE语句。
REPLACE str1 WITH str2 INTO s_dest [LENGTH len].
该语句对字段s_dest进行搜索,如果在其中出现了字符串str1,则用str2替换第一次出现的部分。如果未指定长度,则搜索整个s_dest。如果指定长度len,则只搜索前len个字节。如果字段SY-SUBRC返回0,则说明已经替换;非0则意味着未进行替换。
REPORT z_string_replace.
DATA name TYPE string.
name = 'Michael-Cheong'.
WHILE sy-subrc = 0.
REPLACE '-' WITH ' ' INTO name.
ENDWHILE.
WRITE / name.
5.确定字段长度,不包括结尾空格,使用STRLEN,语句将操作数str作为字符数据类型处理,不考虑实际类型,也不进行转换
[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 将字符串整体或子串进行位移
- CONDENSE 删除字符串中的多余空格
- TRANSLATE 字符转换,例如将ABC转换为abc
- CONVERT TEXT 创建一个可以排序的格式
- OVERLAY 用一个字符串覆盖另一个字符串
- WRITE TO 赋值时,将忽略数据对象类型,将其视为字符类型数据
3. 字符数据比较
字符型逻辑表达式用于判断两个字符串之间的包含关系
运算符 | 含义 |
---|---|
s1 CO s2 | 如果s1仅包含s2中的字符,则逻辑表达式为真 |
s1 CN s2 | 如果s1包含s2之外的其他字符,则逻辑表达式为真 |
s1 CA s2 | 如果s1包含任何一个s2中的字符,则逻辑表达式为真 |
s1 NA s2 | 如果s1不包含s2的任何字符,则逻辑表达式为真 |
s1 CS s2 | 如果s1包含字符串s2,则逻辑表达式为真 |
s1 NS s2 | 如果s1不包含字符串s2,则逻辑表达式为真 |
s1 CP s2 | 如果s1包含模式s2,则逻辑表达式为真 |
s1 NP s2 | 如果s1不包含模式s2,则逻辑表达式为真 |
CO,CN,CA,NA比较时要区分大小写,并且尾部空格也在比较的范围之内;使用CS,NS,CP,NP比较时忽略尾部空格并且比较不区分大小写。比较结束后,如果结果为真,系统字段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被称为模式比较逻辑表达式,意义在于可以使用通配符。
“*”用于替代任何字符串,“+”用于替代任何单个字符。
如需对大小写或尾部空格进行区分比较,需要将换码字符“#”放到相应的字符前。下面列出可以使用“#”指定的功能:
- 大小写字符,指定大小写(如#A,#b)
- 通配符“”(输入#),将其转回原意
- 通配符“+”(输入#+),将其转回原意
- 换码符号本身(输入##),将其转回原意
- 字符串结尾的空格(输入#_),指定比较结尾空格
3 定位操作子串
仅操作指定的部分子串。
s [+o][(1)]
其意义是对字段s从第o位开始(从0开始偏移)且长度为1的部分执行该语句操作。如果未指定长度,则对字段s第o和结尾之间的所有位进行处理。
REPORT z_string_replace.
DATA: f1(8) VALUE 'ABCDEFGH',
f2(20) VALUE '12345678901234567890'.
f2+6(5) = f1+3(5).
WRITE : / f1, / f2.
通常,必须将偏移量和长度指定为无符号数。然而,一下情况中可以使用变量动态指定:
- 用MOVE语句或赋值运算符给字段赋值时
- 用WRITE TO语句向字段携入值时
- 用ASSIGN将字段分配给字段符号时
- 用PERFORM将数据传送给子程序时
对字符类型,数值文本字段,十六进制字段,日期和时间字段指定偏移量是有意义的;类型F,I,P数值字段则不要使用指定偏移量。