首页 > SAP > ABAP > ABAP对字符的一些基础操作–
2019
08-29

ABAP对字符的一些基础操作–

1.对字符串的操作

1).SHIFT:截断字符串

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都去掉。

以上语句常用的场合:

A.去掉字符串中的前导字符。例如:如果alv中定一了一个字段是10位的字符,里面放的是so,po等number,而你不想显示前面的0,那么就可以这样做:SHIFT {c} LEFT DELETING LEADING 0.

B.已知某个字符串中包含固定的字符,想把这个固定字符前面的字符删掉,那么可以使用:SHIFT {c} UP TO {str}。例如:某个物料,通过增强mga00002和mga00003对其加了前缀,这个前缀部分是在某固定值表中取得的数据,在具体显示中,要把其前缀去掉。如TE-MRP-MAT1中想把te去掉,mrp表示该物料是跑mrp的,需求要求把te-去掉,mrp可以在固定值表中取得,则可以使用SHIFT {c} UP TO ‘MRP’.

2).REPLACE:替换字符串

REPLACE {str1} WITH {str2} INTO {c} [LENGTH {l}].:

作用:把字符串c中的str1替换成str2,如果指定l,就是指定了替换的长度。如果替换成功,则SY-SUBRC设置成0。

常用场合:

字符串的替换操作比较常用,需要注意的是l的指定长度。

3). TRANSLATE:转换字符串

TRANSLATE {c} TO UPPER CASE.

TRANSLATE {c} TO LOWER CASE.:

作用:字符串的大小写的转换

TRANSLATE {c} USING {r}. :

作用:根据规则r转换字符串c

常用场合:

Sap系统一般都是使用大写字母的,但是某些特定的字段却是用小写字母来标记的,在操作这些字段的时候就需要注意大小写的转换了。转换规则倒是不太常用,到现在我还没有遇到过。

4). SEARCH:查找字符串

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}指定结束位置

常用场合:

一般用来判断某个字符串是否符合条件。也可以结合其他语句对字符串进行操作。

5).CONDENSE:去掉字符串中的空格

CONDENSE {c} [NO-GAPS].:

作用:去掉字符串中的前面和后面的空格,如果指定NO-GAPS,则去掉字符串中的所有空格。

常用场合:获得字符串的精确长度,用于判断。

6).SPLIT:拆分字符串

SPLIT {c} AT {del} INTO {c1} … {cn}.

作用:按照分割字符del把字符串c分割成c1…cn。

SPLIT {c} AT {del} INTO TABLE {itab}.

作用:按照分割字符del把c分割,然后放到内表中的相应字段

常用场合:

文件名的分割,根据完整的文件路径加文件名把文件名分割出来。

难点:无法确定要分割多少次.

解决方法:两两分割,到最后的那个就是了。例如:str=c:dir1dir2dir3file

Split str at ” into str1 str2.

Find str2 for ‘/’.

Check sy-subrc = 0.

Do.

Find str2 for ‘/’.

If sy-subrc = 0.

Split str2 into str1 str2.

Else.

Exit.

Endif.

Enddo.

文件上传的类型是字符串,把其分割后放到内表中。例如上面的问题:

data: begin of itab occurs 0 ,

col1(30) type c,

end of itab.

Split str at ” into table itab.

describe table itab lines line.

Read table itab index line.

Itab-col1就是file

7).CONCATENATE:连接字符串

CONCATENATE {c1} … {cn} INTO {c} [SEPARATED BY {s}].

作用:把c1…cn用s分隔连接到c中

常用场合:文件下载,对文件中的字段编辑。

字符串首字符索引为 0; Character Fields: C,N, D, T, string (CNDT=> CN Data Time)

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 notCA / NA contains any or not anyCS / 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’.

最后编辑:
作者:yangsen
有需要可在文章留言或者邮件yan252@163.com给我。

留下一个回复

你的email不会被公开。

3 × three =