ABAP 字符串连处理
1.拆分字符串
语法:
SPLIT INTO
1 DATA: STRING(60),
2 P1(20) VALUE '',
3 P2(20) VALUE '',
4 P3(20) VALUE '',
5 P4(20) VALUE '',
6 DEL(3) VALUE '***'.
7 STRING = ' Part 1 *** Part 2 *** Part 3 *** Part 4 *** Part 5'.
8 WRITE STRING.
9 SPLIT STRING AT DEL INTO P1 P2 P3 P4.
10 WRITE: /'P1:' , P1.
11 WRITE: /'P2:' , P2.
12 WRITE: /'P3:' , P3.
13 WRITE: /'P4:' , P4.
该过程的输 出如下:
Part 1 *** Part 2 *** Part 3 *** Part 4 *** Part 5
P1:Part 1
P2:Part 2
P3:Part 3
P4:Part 4 *** Part 5
2.连接字符串
语法:
CONCATENATE ].
1 DATA: C1(10) VALUE 'Sum',
2 C2(3) VALUE 'mer',
3 C3(5) VALUE 'holi ',
4 C4(10) VALUE 'day',
5 C5(30),
6 SEP(3) VALUE ' - '.
7 CONCATENATE C1 C2 C3 C4 INTO C5.
8 WRITE C5.
9 CONCATENATE C1 C2 C3 C4 INTO C5 SEPARATED BY SEP.
10 WRITE / C5.
该过程的输 出如下:
Summerholiday
Sum - mer - holi - day
在 C1 到 C5 之间,忽略 尾部空格。 分隔符 SEP 保留尾部空格。
3.获得字符串长度
语法:
[COMPUTE]
1 DATA: INT TYPE I,
2 WORD1(20) VALUE '12345'.
3 WORD2(20).
4 WORD3(20) VALUE ' 4 '.
5 INT = STRLEN( WORD1 ).
6 WRITE INT.
7 INT = STRLEN( WORD2 ).
8 WRITE / INT.
9 INT = STRLEN( WORD3 ).
10 WRITE / INT.
结果分别是 5,0 和 4。
WORD3(20) VALUE ' 4 '. 结果为 4 。
请注意,STRLEN 将操作数
4.压缩字段内容
语法:
CONDENSE
该语句去除字段
1 DATA: STRING(25) VALUE ' one two three four',
2 LEN TYPE I.
3 LEN = STRLEN( STRING ).
4 WRITE: STRING, '!'.
5 WRITE: / 'Length: ', LEN.
6 CONDENSE STRING.
7 LEN = STRLEN( STRING ).
8 WRITE: STRING, '!'.
9 WRITE: / 'Length: ', LEN.
10 CONDENSE STRING NO-GAPS.
11 LEN = STRLEN( STRING ).
12 WRITE: STRING, '!'.
13 WRITE: / 'Length: ', LEN.
该过程的输出如下:
one two three four !
Length: 25
one two three four !
Length: 18
onetwothreefour !
Length: 15
请注意,字段 STRING 的总长度保持不变(注意!的位置),但删除的空格再次出现在右边。
5.搜索字符串
语法:
SEARCH
该语句在字 段
否则将 SY-SUBRC 设置为4。
搜索串
---------------------------------
.
*
单词之间用 空格、逗号 、句号、分 号、冒号、 问号、叹号 、括号、斜 杠、加号和等号等分隔 。
1 DATA STRING(30) VALUE 'This is a little sentence.'.
2 WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.
3 ULINE /1(26).
4 SEARCH STRING FOR 'X'.
5 WRITE: / 'X', SY-SUBRC UNDER 'SY-SUBRC',
6 SY-FDPOS UNDER 'SY-FDPOS'
7 SEARCH STRING FOR 'itt '.
8 WRITE: / 'itt ', SY-SUBRC UNDER 'SY-SUBRC',
9 SY-FDPOS UNDER 'SY-FDPOS'
10 SEARCH STRING FOR '.e .'.
11 WRITE: / '.e .', SY-SUBRC UNDER 'SY-SUBRC',
12 SY-FDPOS UNDER 'SY-FDPOS'.
13 SEARCH STRING FOR '*e'.
14 WRITE: / '*e ', SY-SUBRC UNDER 'SY-SUBRC',
15 SY-FDPOS UNDER 'SY-FDPOS'.
16
17 SEARCH STRING FOR 's*'.
18 WRITE: / 's* ', SY-SUBRC UNDER 'SY-SUBRC',
19 SY-FDPOS UNDER 'SY-FDPOS'.
该过程的输 出如下:
SEARCHED SY-SUBRC SY-FDPOS
X 4 0
itt 0 11
.e . 0 15
*e 0 10
s* 0 17
搜索字符字 段
在字段
在字段
在字段
如果找到搜索串,则将搜索串中的所有字符(使用 ABBREVIATED 时的所有字 符)转换为大写形式。
1 DATA: STRING(30) VALUE 'This is a fast first example.',
2 POS TYPE I,
3 OFF TYPE I.
4 WRITE / STRING.
5 SEARCH STRING FOR 'ft' ABBREVIATED.
6 WRITE: / 'SY-FDPOS:', SY-FDPOS.
7 POS = SY-FDPOS + 2.
8 SEARCH STRING FOR 'ft' ABBREVIATED STARTING AT POS AND MARK.
9 WRITE / STRING.
10 WRITE: / 'SY-FDPOS:', SY-FDPOS.
11 OFF = POS + SY-FDPOS -1.
12 WRITE: / 'Off:', OFF.
该过程的输出如下:
This is a fast first example.
SY-FDPOS: 10
This is a fast FIRST example.
SY-FDPOS: 4
Off: 15
请注意,在 找到单词‘ fast’ 之后,为了 查找包含‘ ft’的第 二个单词, 必须在偏移 量 SY-FDPOS 上加2,然 后从位置 POS 开始查找。 否则,会再 次找到单词 ‘fast’ 。要获得‘ first’ 相对于字段 STRING 开始的偏移 量,从 POS 和 SY-FDPOS 计算。
字符串: 'Aaa-Bbb' 如何判断字符串中含有 '-'?
并且将 '-' 后面的字符舍去?
DATA string(20) VALUE 'Aaa-Bbb'.
SEARCH string FOR '-'.
IF sy-subrc = 0.
string = string+0(sy-fdpos).
WRITE string.
ENDIF.
6.覆盖字符字段
语法:
OVERLAY
该语句用字符串
如果省略 ONLY
如果
解释:
注意是"覆盖"不是”替换“!!!!!!!!!
OVER '1 2 3' WITH '456 '.
结果为:152 3。
OVER '1 2 3' WITH '456' only '12'.
结果为:4 6 3 。
OVER '123' WITH '456'.
结果为:123。(没有空格)
OVER '1 2 3 ' WITH '456 ' only '13' .
结果为:4 2 。
DATA: T(10) VALUE 'a c e g i ',
STRING LIKE T,
OVER(10) VALUE 'ABCDEFGHIJ',
STR(2) VALUE 'ai'.
STRING = T.
WRITE STRING.
WRITE / OVER.
OVERLAY STRING WITH OVER.
WRITE / STRING.
STRING = T.
OVERLAY STRING WITH OVER ONLY STR.
WRITE / STRING.
该过程的输 出如下:
a c e g i
ABCDEFGHIJ
aBcDeFgHiJ
A c e g I
T 与 OVER 的长度都是10。
7.替换字段内容
语法:
REPLACE
ABAP/4 搜索字段
1 DATA: T(10) VALUE 'abcdefghij',
2 STRING LIKE T,
3 STR1(4) VALUE 'cdef',
4 STR2(4) VALUE 'klmn',
5 STR3(2) VALUE 'kl',
6 STR4(6) VALUE 'klmnop',
7 LEN TYPE I VALUE 2.
8 STRING = T.
9 WRITE STRING.
10 REPLACE STR1 WITH STR2 INTO STRING.
11 WRITE / STRING.
12 STRING = T.
13 REPLACE STR1 WITH STR2 INTO STRING LENGTH LEN.
14 WRITE / STRING.
15 STRING = T.
16 REPLACE STR1 WITH STR3 INTO STRING.
17 WRITE / STRING.
18 STRING = T.
19 REPLACE STR1 WITH STR4 INTO STRING.
20 WRITE / STRING.
该过程的输 出如下:
abcdefghij
abklmnghij
abklmnefgh
abklghij
abklmnopgh
请注意,在最后一行中字段 STRING 是如何在右 边截断的。长度为 4 的搜索模式 ‘cdef’ 用长度为6的 ‘klmnop’ 替换。然后 ,填充字段 STRING 的剩余部分直到字段结尾。
8.转换大/小写并替换字符
可以将字母 转换大/小 写或使用替 换规则。 要转换大/小 写,请使用 TRANSLATE 语句,用法 如下:
语法
TRANSLATE
这些语句将 字段
使用替换规 则时,请使 用以下语法 :
语法
TRANSLATE
该语句根据 字段
1 DATA: T(10) VALUE 'AbCdEfGhIj',
2 STRING LIKE T,
3 RULE(20) VALUE 'AxbXCydYEzfZ'.
4 STRING = T.
5 WRITE STRING.
6 TRANSLATE STRING TO UPPER CASE.
7 WRITE / STRING.
8 STRING = T.
9 TRANSLATE STRING TO LOWER CASE.
10 WRITE / STRING.
11 STRING = T.
12 TRANSLATE STRING USING RULE.
13 WRITE / STRING.
该过程的输 出如下:
AbCdEfGhIj
ABCDEFGHIJ
abcdefghij
xXyYzZGhIj
9.转换为可排序格式
可以将字符 字段转换为 可按字母顺 序排列的格 式:
语法
CONVERT TEXT
该语句为字 符字段
创建相关字 段
如果对未转 换的字符字 段进行排序 ,则系统创 建与各字母 的特定平台 内部编码相 对应的顺序 。在对目标 字段进行排 序之后,转 换 CONVERT TEXT 按这样的方 式创建目标
字段,相应 的字符字段 顺序按字母 排序。例如 ,在德语中 ,顺序为‘ Miller、 Moller、 M?ller、 Muller’ ,而不是‘ Miller、 Moller、 Muller、 M?ller’ 。
转换方法依 赖于运行 ABAP/4 程序的文本 环境。文本 环境在用户 主记录中定 义。例外的 是可以使用 如下语句, 在程序中设 置文本环境 :
语法
SET LOCALE LANGUAGE
该语句根据 语言
语言以外指 定国家。对 于选项 MODIFIER, 只要一个国 家内语言不 同,就可以 指定另一个 标识符,例 如,排序顺 序在电话簿 和词典之间 不同。 字段
TCP0C中 的条目设置 文本环境。 除了内部传 送的平台特 性之外,用 SET 语句指定表 关键字。如 果
定的 关键字在表 中无条目, 则系统将产 生运行错误 。
文本环境影 响 ABAP/4 中依赖于字 符集的所有 操作。
10.移动字段内容
按给定位置 数移动字段串
要按给定位 置数移动字 段内容,请 使用 SHIFT 语句,用法 如下:
语法
SHIFT
该语句将字 段
1 DATA: T(10) VALUE 'abcdefghij',
2 STRING LIKE T.
3 STRING = T.
4 WRITE STRING.
5 SHIFT STRING.
6 WRITE / STRING.
7 STRING = T.
8 SHIFT STRING BY 3 PLACES LEFT.
9 WRITE / STRING.
10 STRING = T.
11 SHIFT STRING BY 3 PLACES RIGHT.
12 WRITE / STRING.
13 STRING = T.
14 SHIFT STRING BY 3 PLACES CIRCULAR.
15 WRITE / STRING.
输出为:
abcdefghij
bcdefghij
defghij
abcdefg
defghijabc
移动字段串 到给定串
要移动字段 内容以到给 定串,则使 用 SHIFT 语句,
语法:
SHIFT
ABAP/4 查找
1 DATA: T(10) VALUE 'abcdefghij',
2 STRING LIKE T,
3 STR(2) VALUE 'ef'.
4 STRING = T.
5 WRITE STRING.
6 SHIFT STRING UP TO STR.
7 WRITE / STRING.
8 STRING = T.
9 SHIFT STRING UP TO STR LEFT.
10 WRITE / STRING.
11 STRING = T.
12 SHIFT STRING UP TO STR RIGHT.
13 WRITE / STRING.
14 STRING = T.
15 SHIFT STRING UP TO STR CIRCULAR.
16 WRITE / STRING.
输出如下:
abcdefghij
efghij
efghij
abcdef
efghijabcd
根据第一个或最后一个 字符移动字段串
假设第一个或最后一个 字符符合一定条件,则 可用 SHIFT 语句将字段 向左或向右 移动。为此 ,请使用以 下语法:
语法
SHIFT
SHIFT
假设左边的 第一个字符 或右边的最 后一个字符 出现在
1 DATA: T(14) VALUE ' abcdefghij',
2 STRING LIKE T,
3 STR(6) VALUE 'ghijkl'.
4 STRING = T.
5 WRITE STRING.
6 SHIFT STRING LEFT DELETING LEADING SPACE.
7 WRITE / STRING.
8 STRING = T.
9 SHIFT STRING RIGHT DELETING TRAILING STR.
10 WRITE / STRING.
该过程输出 如下:
abcdefghij
abcdefghij
abcdef
11.MOVE TO 分配字符串部分
MOVE 语句的以下 变体只使用 类型 C 字段:
语法:
MOVE [RIGHT].
将字符字段
1 DATA: C1(10) VALUE 'ABCDEFGHIJ',
2 C2(10).
3 MOVE C1 TO C2 PERCENTAGE 40.
4 WRITE C2.
5 MOVE C1 TO C2 PERCENTAGE 40 RIGHT.
6 WRITE / C2.
该过程的输 出如下:
ABCD
ABCD
12.比较字符串
要比较字符 串(类型 C)和数字 文本(类型 N),可以 在逻辑表达 式中使用下 列运算符。
<运算符> 含 义
CO 仅包含
CN 不仅包含
CA 包含任何
NA 不包含任何
CS 包含字符串
NS 不包含字符串
CP 包含模式
NP 不包含模式
因为除类型 N 和 C 外,系统不 能执行任何 其它类型转 换,所以, 在进行包含 这些运算之 一的比较时 ,操作数应 该是类型 N 或 C。 运算符的功 能如下:
CO (仅包含)
如果
CN (不仅包含 )
如果
CA (包含任何 )
如果
NA (不包含任 何)
如果
CS (包含字符 串)
如果
NS (不包含字 符串)
如果
CP (包含模式 )
如果
忽略尾部空 格且比较不 区分大小写 。如果比较 结果为真, 系统字段 SY-FDPOS 包含
NP (不包含模 式)
如果
DATA: F1(5) TYPE C VALUE
F2(5) TYPE C VALUE
IF F1
WRITE: / 'Comparison true, SY-FDPOS=', SY-FDPOS.
ELSE.
WRITE: / 'Comparison false, SY-FDPOS=', SY-FDPOS.
ENDIF.
下表列出该 程序的执行 结果,取决 于所用的运 算符和 F1 / F2 字段。
'BD ' CO 'ABCD '
'BD ' CO 'ABCDE' 假 2
'ABC12' CN 'ABCD ' 真 3
'ABABC' CN 'ABCD ' 假 5
'ABcde' CA 'Bd ' 真 1
'ABcde' CA 'bD ' 假 5
'ABAB ' NA 'AB ' 假 0
'ababa' NA 'AB ' 真 5
'ABcde' CS 'bC ' 真 1
'ABcde' CS 'ce ' 假 5
'ABcde' NS 'bC ' 假 1
'ABcde' NS 'ce ' 真 5
'ABcde' CP '*b*' 真 1
'ABcde' CP '*#b*' 假 5
'ABcde' NP '*b*' 假 1
'ABcde' NP '*#b*' 真 5
1. 字符串连接 CONCATENATE dobj1 dobj2 ... INTO result [IN { BYTE | CHARACTER } MODE] [SEPARATED BY sep].
2.字符串分隔, split 一个string的部分到一个内表或一系列的变量 SPLIT dobj AT sep INTO { {result1 result2 ...} | {TABLE result_tab} } [IN {BYTE|CHARACTER} MODE].
3. 字符串查找, 在一个字符串中查找模式串(FIND or SEARCH) FIND sub_string IN SECTION [OFFSET off] [LENGTH len] OF dobj --> 灰色部分用来缩小目的串被查找的范围 [ IN { BYTE | CHARACTER } MODE ] [ { RESPECTING | IGNORING } CASE ] [ MATCH OFFSET moff ] [MATCH LENGTH mlen ].
FIND 'knows' IN SECTION OFFSET 5 OF 'Everybody knows this is nowhere' MATCH OFFSET moff " => moff = 10 MATCH LENGTH mlen. " => mlen= 5
在字符串dobj中查找pattern SEARCH dobj FOR pattern [IN { BYTE | CHARACTER } MODE] [STARTING AT p1] [ENDING AT p2] [ABBREVIATED] [AND MARK]. if sy-subrc = 0. then SY-FDPOS = 返回pattern在dobj中的位置 About pattern: 'pat' - 忽略尾部空格 '.pat.' -不忽略尾部空格 '*pat' - 以pat结尾 'pat*' - 以pat开始 单词是指: 用 空格 , ; : ? ! () / + =分隔的字串
4. 字符串替换 REPLACE SECTION [OFFSET off] [LENGTH len] OF dobj WITH new [IN { BYTE | CHARACTER } MODE].
REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] [SUBSTRING] sub_string IN [SECTION [OFFSET off] [LENGTH len] OF ] dobj WITH new [IN {BYTE|CHARACTER} MODE] [{RESPECTING|IGNORING} CASE] [REPLACEMENT COUNT rcnt] [REPLACEMENT OFFSET roff] [REPLACEMENT LENGTH rlen]. eg: DATA: text1 TYPE string VALUE 'xababx'. REPLACE 'ab' IN text1 WITH 'xx'. --> xxxabx
5. 去前导0 (Remove leading zero) SHIFT dobj LEFT DELETING LEADING '0'. FM : CONVERSION_EXIT_ALPHA_OUTPUT
增前导0 (Add leading zero) DATA v_s(5). UNPACK '123' to v_s. ==> v_s = '00123' FM: CONVERSION_EXIT_ALPHA_INPUT
SHIFT dobj [{BY num PLACES} | {UP TO sub_string}] [LEFT|RIGHT] [CIRCULAR] SHIFT dobj {LEFT DELETING LEADING} | {RIGHT DELETING TRAILING} pattern. [IN {BYTE|CHARACTER} MODE].
6. 字符串的长度, 内表的行数 STRLEN( dobj) 字符串的长度 LINES( itab ) 内表的行数
7. 删字符串中的空格: CONDENSE text [NO-GAPS].
8. 大小写转换,字符变换 TRANSLATE text {TO {UPPER|LOWER} CASE} | {USING pattern}. eg: text = `Barbcbdbarb`. TRANSLATE text USING 'ABBAabba'. =>'Abracadabra'
9. CONVERT CONVERT DATE dat [TIME tim [DAYLIGHT SAVING TIME dst]] INTO TIME STAMP time_stamp TIME ZONE tz.
CONVERT TIME STAMP time_stamp TIME ZONE tz INTO [DATE dat] [TIME tim] [DAYLIGHT SAVING TIME dst].
CONVERT TEXT text INTO SORTABLE CODE hex.
10. OVERLAY text1 WITH text2 [ONLY pattern]. 如果不指定后面的ONLY pattern, text1中的空格会被text2中的对应字符替代 如果指定只有匹配的字符才会被替代,注意大小写敏感
11. 模式匹配 CO / CN contains only or not CA / NA contains any or not any CS / NS contain string or not CP / NP contains pattern or not
NOTE: a) . CO, NO, CA, NA比较时区分大小写, 并且尾部空格也在比较的范围之内 data: s1(10) value 'aabb'. if s1 co 'ab' ==> false if s1 co 'ab ' ==>true CS, NS, CP, NP不区分大小写和尾部空格
b) .对于CP, NP * = \s? + = \s # 换码字符, 用于匹配 *, +这样的字符 ## #* #+ #___ 比较结尾空格 #[a-z] 在CP, NP中强制区分大小写
c) . 比较结束后,如果结果为真,sy-fdpos将给出s2在s1中的偏移量信息
12. 特殊字符 在字符串中加入回车换行或TAB字符,在其他语言可以使用$13$10这样的ASCII码进行插入.但在ABAP中要使用sap的类CL_ABAP_CHAR_UTILITIES. 里面有字符常量:CR_LF,HORIZONTAL_TAB,NEWLINE等等.
13. 字符串位操作 DATA: v_s(10) value 'abcd'. v_s+0(1) = 'b'. v_s+2(*) = '12'. => v_s = 'bb12'.