sap abap 字符串处理 2012-11-27 15:36:00| 分类: ABAP | 标签: |字号大
中
小 订阅
取前N位
a = a(N). "取前N位
a = a+N(2). "取第N位后的2位
a = a+N . "取第N位后的所有字符
-------------------------------------------------------
拆分字符串
SPLIT {c} AT {del} INTO {c1} ... {cn}.
作用:按照分割字符del把字符串c分割成c1…cn。
SPLIT {c} AT {del} INTO TABLE {itab}.
作用:按照分割字符del把c分割,然后放到内表中的相应字段
--------------------------------------------------------
去空格
CONDENSE {c} [NO-GAPS].:
作用:去掉字符串中的前面和后面的空格,如果指定NO-GAPS,则去掉字符串中的所有空格。
常用场合:获得字符串的精确长度,用于判断。
-------------------------------------------------------
替换字符串
REPLACE {str1} WITH {str2} INTO {c} [LENGTH {l}].:
作用:把字符串c中的str1替换成str2,如果指定l,就是指定了替换的长度。如果替换成功,则SY-SUBRC设置成0。
-------------------------------------------------------
转换字符串
TRANSLATE {c} TO UPPER CASE.
TRANSLATE {c} TO LOWER CASE.:
作用:字符串的大小写的转换
TRANSLATE {c} USING {r}. :
作用:根据规则r转换字符串c
-------------------------------------------------------
截断字符串
SHIFT {c} [BY {n} PLACES] [{mode}].:
作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不
变。如果n超出字符串的长度,则字符串变空,所以在做此操作的时候要注意n的指定。可以首先获得该字符串的长度,方法:len=STRLEN(C)。
Mode:指定字符串截断的方向。
LEFT:从左边截断
RIGHT:从右边截断
CIRCULAR:把左边的字符放到右边。
SHIFT {c} UP TO {str} {mode}.:
作用:把字符串中在str以前的字符都去掉,同样可以指定mode,原理同上。
SHIFT {c} LEFT DELETING LEADING {str}.
SHIFT {c} RIGHT DELETING TRAILING {str}.:
作用:这两个语句就是把字符串c中前的(LEFT)或者后的(RIGHT)的字符str都去掉。
-------------------------------------------------------
查字符串
SEARCH {c} FOR {str} {options}.:
作用:在字符串c中查str,如果到了,SY-SUBRC为0,SY-FDPOS为到字符串的具体位置。
需要说明的地方:注意模式的使用
指定str:查str,str中后面的空格忽略
指定.str.:查str,包含了str中尾部的空格
指定*str:查以str结尾的字符串
指定str*:查以str开头的字符串
{options}的指定:
主要用到的就是:STARTING AT {n1}指定开始位置, ENDING AT {n2}指定结束位置
本篇文章主要介绍ABAP编程中字符串的控制与操作,好了废活说多了也没用,开始吧。
1)CONCATENATE:实现字符串的合并。
基
本语法:
CONCATENATE f1...fn INTO g [SEPARATED BY h]
FOR EXAMPLE:
DATA:one(10) VALUE 'Hello',
two(10) VALUE 'SAP',
result1(10),
result2(10),
l1 TYPE I,
l2 TYPE I.
CONCATENATE one two INTO result1 SEPARATED BY SPACE.
CONCATENATE one two INTO result2.
l1 = STRLEN( result1 ) + STRLEN( result2 ).
WRITE: / 'result1=',result1, "输出: result1=Hello SAP
/ 'result2=',result2. "输出:result2=HelloSAP
WRITE: / 'STRLEN=',l1. "输出:STRLEN=17
以上所示代码输出结果为result1等于Hello SAP,result2等于HelloSAP,SPARATED BY表示在连接字符串中加入分隔符号,不然合并字符串的前后空格会自动清除,上例所示中加入了空格。
2)SPLIT:实现字符串的拆分。
SPLIT f AT g hn:将字符串的值分配给具体变量。
SPLIT f AT g INTO TABLE itab:将字符串的值分配给一内表。
FOR EXAMPLE:
DATA:names(30) TYPE C VALUE 'HELLO,SAP',
names2 TYPE STRING,
sone(10) TYPE C,
stwo(10) TYPE C,
delimiter(1) VALUE ','.
TYPES:BEGIN OF itab_type,
word(20),
END OF itab_type.
DATA myitab TYPE STANDARD TABLE OF itab_type WITH HEADER LINE. "定义内表
SPLIT names AT delimiter INTO sone stwo.
SPLIT 'ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINTH,TEN,ELEVEN,TWELVE' AT delimiter INTO TABLE myitab.
WRITE: / 'sone=',sone, "输出:sone=HELLO
/ 'stwo=',stwo. "输出:stwo=SAP
LOOP AT myitab.
WRITE myitab. "循环输出ONE、ELEVEN。
ENDLOOP.
3)SHIFT:将字符串整体或者子串进行转移
SHIFT c <LEFT/RIGHT/CIRCULAR>.:指定字符移动方向,向左、向右或者循环移动一个字符,默认向左。
SHIFT c BY n PLACES.:指定移动字符位数。
如果操作对象是C类型,那么它的所有字符都会向前移动一位,最后一位用空格代替。倘若为STRING类型,所有的字符都会向前移动一位,最好一位删除。
FOR EXAMPLE:
DATA:str1(10) TYPE C VALUE 'ABCDEFGHIJ'.
str2 TYPE STRING,
str3(10) TYPE C,
str4(10) TYPE C,
str5(10) TYPE C,
str6(10) TYPE C.
str6 = str5 = str4 = str3 = str2 = str1.
SHIFT str1. "执行结果:'BCDEFGHIJ ',整体长度不变,左移一位,最后为空格
SHIFT str2. "执行结果:'BCDEFGHIJ',左移一位,最后一位删除
SHIFT str3 RIGHT. "执行结果:' ABCDEFGHI',整体长度不变,右移一位,首位为空格
SHIFT str4 CIRCULAR. "执行结果:'BCDEFGHIJA',整体长度不变,字符循环移动一位
SHIFT s
tr5 BY 5 PLACES. "执行结果:'FGHIJ ',整体向左移动5位
SHIFT str6 RIGHT BY 2 PLACES. "执行结果:' ABCDEFGHIJ',整体向右移动2位
4)SHIFT语法二
SHIFT c UP TO c1.:该定义可指定某字符从某一具体子串进行位移,并将执行结果返回给系统变量SY-SUBRC,若执行成功时,返回值为"0",倘若子串与原字符串不匹配,返回值为"4"。
FOR EXAMPLE:
DATA:shift_str1(10) VALUE 'ABCDEFGHIJ',
shift_str2(10) VALUE 'ABCDEFGHIJ',
s_three(3) VALUE 'DEF',
s_four(4) VALUE 'DEF '.
SHIFT shift_str1 UP TO s_three.
WRITE: / 'shift_str1=',shift_str1,',SY-SUBRC=',SY-SUBRC. "输出:shift_str1='DEFGHIJ',SY-SUBRC=0
SHIFT shift_str2 UP TO s_four.
WRITE: /'shift_str2=',shift_str2,',SY-SUBRC=',SY-SUBRC. "输出:shift_str2='ABCDEFGHIJ',SY-SUBRC=0
5)SHIFT语法三
SHIFT c LEFT DELETING LEADING c1.:移除字符串左边的字符串。
SHIFT c RIGHT DELEING TRAILING c1.:移除字符串右边的子字符串。
FOR EXAMPLE:
DATA: shift_string1(15) VALUE ' ABCDEFGHIJ',
shift_string2(15) VALUE ' ABCDEFGHIJ',
shift_string3(15) VALUE ' ABCDEFGHIJ',
shift_string4 TYPE STRING,
m1(4) VALUE 'ABCD',
m2(6) VALUE 'HIJ'.
shift_string4 = shift_string1.
WRITE: / 'shift_string1=',shift_string1. "输出:shift_string1= ' ABCDEFGHIJ'。
SHIFT shift_string1 LEFT DELETING LEADING SPACE.
WRITE: / 'shift_string1=',shift_string1,'AA'. "输出:shift_string1= 'ABCDEFGHIJ AA',移除前面空格,后面补空格。
WRITE: / 'shift_string2=',shift_string2. "输出:shift_string2= ' ABCDEFGHIJ'。
SHIFT shift_string2 RIGHT DELETING TRAILING m1.
WRITE: / 'shift_string2=',shift_string2. "输出:shift_string2=' ABCDEFGHIJ',子字符不符合条件,未发生改变。
WRITE: / 'shift_string3=',shift_string3. "输出:shift_string3= ' ABCDEFGHIJ'。
SHIFT shift_string3 RIGHT DELETING TRAILING m2.
WRITE: / 'shift_string3=',shift_string3. "输出:shift_string3= ' ABCDEFG',移除字符串右边'HIJ',前面补空格。
WRITE: / 'shift_string4=',shift_string4. "输出:shift_string4= ' ABCDEFGHIJ'。
SHIFT shift_string4 LEFT DELETING LEADING SPACE.
WRITE: / 'shift_string4=',shift_string4,'AA'. "输出:shift_string4= 'ABCDEFGHIJ',直接删除前面的空格。
6)CONDENSE:重新整合分配字符串
CONDENSE c <NO-GAPS>.
FOR EXAMPLE:
DATA condense_name(30).
condense_name(10) = ' Dr.'.
condense_name+10(10) = 'Michael'.
condense_name+20(10) = 'Hofmann'.
CONDENSE condense_name.
WRITE: / 'condense_name=',condense_name. "输出:'Dr. Michael Hofmann'
变量被重新赋值,并
以空格分开,字符串前置空格被删除。若在函数后加上关键字"NO-GAPS",那么输出结果将变化为:'Dr.MichaelHofmann'。该语法同样适用于结构体中,结构体中的不同字段内容将会按字段长度被重新分配。
DATA: BEGIN OF condense_name2,
title(8) VALUE ' Dr.',
first_name(10) VALUE 'Michael',
surname(10) VALUE 'Hofmann',
END OF condense_name2.
CONDENSE condense_name2.
WRITE: / 'condense_name2=',condense_name2. "输出:Dr. Michael Hofmann 按原值输出。
WRITE: / 'condense_name2-title=',condense_name2-title, "输出:Dr. Mich,title字段被重新按长度赋值,长度为8。
/ 'condense_name2-first_name=',condense_name2-first_name, "输出:ael Hofman,first_name字段被重新按长度赋值,长度为10。
/ 'condense_name2-surname=',condense_name2-surname. "输出:n,surname字段被重新按长度赋值,长度为10。故就剩下未尾字母n。
7)TRANSLATE:实现字符串转换
TRANSLATE c TO UPPER CASE.:将字符串转换为大写。
TRANSLATE c TO LOWER CASE.:将字符串转换为小写。
FOR EXAMPLE:
DATA:city(9) TYPE C VALUE 'dongguang',
country(5) TYPE C VALUE 'CHINA'.
TRANSLATE city TO UPPER CASE.
TRANSLATE country TO LOWER CASE.
WRITE: / 'city=',city,
/ 'country=',country.
执行结果:city=DONGGUANG country=china。
TRANSLATE c USING c1.:将一字符串参照另一字符串转换。
按逐个字符判断,若原字符串中的某一字符在参考字符串中存在,那么取参考字符串中该字符首次出现
位置的下一个字符串作为转换对象。若参考字符串中不存在该字符或该字符首次出现位置在参考字符串的最后一位,则不进行转换。
FOR EXAMPLE:
DATA:translate_str1(20) TYPE C VALUE 'abcabcabcXabcf',
translate_str2(15) TYPE C VALUE 'aXbaYBzbZacZB'.
TRANSLATE translate_str1 USING translate_str2.
WRITE: / 'translate_str1=',translate_str1. "执行结果:'XaZXaZXaZXXaZf'.
FROM CODE PAGE g1 ... TO CODE PAGE g2.
SAP可以应用于多种软硬件系统,不同系统间的信息传递和通信必然涉及代码转换问题。例如,HP-UX系统与IBM EBCDIC系统中的代码转换可通过下列语句实现,具体的代码保存在数据表TCP100中。
FOR EXAMPLE:
TRANSLATE c FROM CODE PAGE '1110' TO CODE PAGE '0100'.
8)OVERLAY:参考字符串对空白字符进行填充。
OVERLAY c1 WITH c2.
该函数对原字符串及参考字符串按字符逐一比较,若原字符串某位置字符值为空而参考字符串有值存在,则用参考字符串字符值进行取代。
FOR EXAMPLE:
DATA:overlay_str1(16) VALUE 'Th t h
s ch ng d',
overlay_str2(20) VALUE 'Grab a pattern'.
OVERLAY overlay_str1 WITH overlay_str2.
WRITE: / 'overlay_str1=',overlay_str1. "输出:overlay_str1='That has changed'.
9)REPLACE:字符串按条件取代
REPLACE f ... WITH g ... INTO field.
FOR EXAMPLE:
DATA replace_str1(10) VALUE '12345ABCDE'.
REPLACE '12345' WITH '56789' INTO replace_str1.
WRITE: / 'replace_str1=',replace_str1. "输出:replace_str1='5678ABCDE'。
10)SEARCH:搜索指定字符串
A)SEARCH f FRO g:g表示被搜索的字符串。
...ABBREVIATED:从指定字符串中按顺序搜索相匹配字符串。
...STARTING AT n1:从字符串n1个字符开始搜索。
...ENDING AT n2:搜索到字符串第n2个字符止。
...AND MARK:从指定字符串是模糊搜索相匹配字符串。
B)SEARCH itab FOR g:g表示被搜索字符串。
.
..ABBREVIATED:从内表中按顺序逐行搜索相匹配字符串。
...STARTING AT line1:从内表中具体某行开始搜索匹配字符串。
...ENDING AT line2:搜索最大范围到内表中具体某行。
...AND MARK:从内表中模糊搜索相匹配字符串。
通过系统变量SY-SUBRC可以回执字符串查的结果,若回执等于"0",则表示查成功。某段字符在字符串中的具体位置保存在系统变量SY-FDPOS中。
DATA search_str(50).
MOVE 'Welcome to SAP world!' TO search_str.
SEARCH search_str FOR 'wld' ABBREVIATED.
WRITE: / 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "执行结果:wld按顺序包含在子字符串'world'中,SY-SUBRC=0,SY-FDPOS=15
SEARCH search_str FOR 'SAP' STARTING AT 10.
WRITE: / '从第十位开始:',
/ 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "执行结果:从第10位开始查,SY-SUBRC=0,SY-FDPOS=2
SEARCH search_str FOR 'SAP' ENDING AT 10.
WRITE: / '查第十位结束:',
/ 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "执行结果:查到第10位结束,SY-SUBRC=4,SY-FDPOS=0
SEARCH search_str FOR '*AP' AND MARK.
WRITE: / '查包含AP的子字符串,SAP符合条件,默认为查SAP:',
/ 'SY-SUBRC=',SY-SUBRC,
/
'SY-FDPOS=',SY-FDPOS. "查包含'AP'子字符串,'SAP'符合条件,默认为查'SAP',SY-SUBRC=0,SY-FDPOS=11
SEARCH search_str FOR '*A' AND MARK.
WRITE: / '匹配字符串必须是子字符串以空格分开的最后几位:',
/ 'SY-SUBRC=',SY-SUBRC,
字段字符串去重复/ 'SY-FDPOS=',SY-FDPOS. "匹配字符串必须是子字符串以空格分开的最后几位,SY-SUBRC=4,SY-FDPOS=0
对于一些特殊符号,如"*"、"@"、"."等,需要在其两边加上顿号
作为修饰。如某字符串为"AAA*BBB",查符号"*"的位置。
DATA search_str2(50).
MOVE 'AAA*BBB' TO search_str2.
SEARCH search_str2 FOR '.*.' ABBREVIATED.
WRITE: / 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS.
从内表中查字符串方法与上面基本类似,若内表有多行,那么字符串查位置默认为从某行数据第一位开始。
DATA:BEGIN OF T_INF OCCURS 0,
LINE(80),
END OF T_INF.
*定义类型后,添加两行数据
APPEND 'HELLO SAP ' TO T_INF.
APPEND 'I am come from china' TO T_INF.
SEARCH T_INF FOR 'SAP' ABBREVIATED.
WRITE: / 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "从内表第一行中可查到,SY-SUBRC=0,SY-FDPOS=6
SEARCH T_INF FOR 'am' ABBREVIATED.
WRITE: / 'SY-SUBRC=',SY-SUBRC, "从内表第二行中可查到,SY-SUBRC=0,SY-FDPOS=2
/ 'SY-FDPOS=',SY-FDPOS.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论