* shifting strings by a given number of places
DATA: t1(10) TYPE c VALUE 'abcdefghij',
string1 LIKE t1.
string1 = t1.
WRITE string1.
SHIFT string1.
WRITE / string1.
string1 = t1.
SHIFT string1 BY 3 PLACES LEFT.
WRITE / string1.
string1 = t1.
SHIFT string1 BY 3 PLACES RIGHT.
WRITE / string1.
string1 = t1.
SHIFT string1 BY 3 PLACES CIRCULAR.
WRITE / string1.
SKIP.
ULINE.
* shifting up to a given string
DATA: t2(10) TYPE c VALUE 'abcdefghij',
string2 LIKE t2,
str2(2) TYPE c VALUE 'ef'.
string2 = t2.
WRITE string2.
SHIFT string2 UP TO str2.
WRITE / string2.
string2 = t2.
SHIFT string2 UP TO str2 LEFT.
WRITE / string2.
string2 = t2.
SHIFT string2 UP TO str2 RIGHT.
WRITE / string2.
string2 = t2.
SHIFT string2 UP TO str2 CIRCULAR.
WRITE / string2.
SKIP.
ULINE.
* shifting a string depending on the first or last sign
DATA: t3(14) TYPE c VALUE ' abcdefghij',
string3 LIKE t3,
str3(6) TYPE c VALUE 'ghijkl'.
string3 = t3.
WRITE string3.
SHIFT string3 LEFT DELETING LEADING space.
WRITE / string3.
string3 = t3.
SHIFT string3 RIGHT DELETING TRAILING str3.
WRITE / string3.
SKIP.
ULINE.
* replacing values
DATA: t4(10) TYPE c VALUE 'abcdefghij',
string4 LIKE t4,
str41(4) TYPE c VALUE 'cdef',
str42(4) TYPE c VALUE 'klmn',
str43(2) TYPE c VALUE 'kl',
str44(6) TYPE c VALUE 'klmnop',
len4 TYPE i VALUE 2.
string4 = t4.
WRITE string4.
REPLACE str41 WITH str42 INTO string4.
WRITE / string4.
string4 = t4.
REPLACE str41 WITH str42 INTO string4 LENGTH len4.
WRITE / string4.
string4 = t4.
REPLACE str41 WITH str43 INTO string4.
WRITE / string4.
string4 = t4.
REPLACE str41 WITH str44 INTO string4.
WRITE / string4.
SKIP.
ULINE.
* translating signs
DATA: t5(10) TYPE c VALUE 'AbCdEfGhIj',
string5 LIKE t5,
rule5(20) TYPE c VALUE 'AxbXCydYEzfZ'.
string5 = t5.
WRITE string5.
TRANSLATE string5 TO UPPER CASE. "#EC SYNTCHAR
WRITE / string5.
string5 = t5.
TRANSLATE string5 TO LOWER CASE. "#EC SYNTCHAR
WRITE / string5.
string5 = t5.
TRANSLATE string5 USING rule5. "#EC SYNTCHAR
WRITE / string5.
SKIP.
ULINE.
translate text using 'Aa#%'. "把字符串text中出现的'A'改为'a','#'改为'%'.
* overlaying strings
DATA: t6(10) TYPE c VALUE 'a c e g i ',
string6 LIKE t6,
over6(10) TYPE c VALUE 'ABCDEFGHIJ',
str6(2) TYPE c VALUE 'ai'.
string6 = t6.
WRITE string6.
WRITE / over6.
OVERLAY string6 WITH over6.
WRITE / string6.
string6 = t6.
OVERLAY string6 WITH over6 ONLY str6.
WRITE / string6.
SKIP.
ULINE.
*searching strings
DATA string7(30) TYPE c VALUE 'This is a little sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.
ULINE /1(26).
SEARCH string7 FOR 'X'.
WRITE: / 'X', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string7 FOR 'itt '.
WRITE: / 'itt ', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string7 FOR '.e .'.
WRITE: / '.e .', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string7 FOR '*e'.
WRITE: / '*e ', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string7 FOR 's*'.
WRITE: / 's* ', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
SKIP.
ULINE.
*
DATA: string8(30) TYPE c VALUE 'This is a fast first example.',
pos8 TYPE i,
off8 TYPE i.
WRITE / string8.
SEARCH string8 FOR 'ft' ABBREVIATED.
WRITE: / 'SY-FDPOS:', sy-fdpos.
pos8 = sy-fdpos + 2.
SEARCH string8 FOR 'ft' ABBREVIATED STARTING AT pos8 AND MARK.
WRITE / string8.
WRITE: / 'SY-FDPOS:', sy-fdpos.
off8 = pos8 + sy-fdpos - 1.
WRITE: / 'Off:', off8.
SKIP.
ULINE.
*一些特殊的字符的查找
The search patterns 'str' and '.str.' are identical apart from a few exceptions. You must use '.str.' when the pattern str contains spaces (at the end), the '.' character (at the beginning and end), or the '*' character (at the end). You should also use '.str.' when the search string str is variable and you cannot predict when you write the statement what the contents of the string will be.
这段英文不用去看,最简单的方法就是,在查找一些特殊的字符(串)的时候,在其前后加个.就可以了.
比如,在查找'.' '*' ' '(空格)的时候.
*去掉后边的0
data text type string value '2.010000'. "必须是string类型的
shift text right deleting trailing '0'.
write text.
下边这种情况:
data: menge type mseg-menge.
data: lc_menge type string.
menge = '10.020'.
lc_menge = menge."在这里赋了值
condense lc_menge."这种情况下,这句必须加
shift lc_menge right deleting trailing '0'.
shift lc_menge right deleting trailing '.'.
write lc_menge.
如果menge = '100',输出之后竟还是100,可能lc_menge的数据来自一个数量,它很奇怪地保护了数据不丢失,
但如果是一串字母,就很正常,没有这种奇怪的现象
比较1与2的区别:
"1
data: menge type mseg-menge.
data: lc_menge type string.
menge = '100000'.
lc_menge = menge."在这里赋了值
condense lc_menge."这种情况下,这句必须加
shift lc_menge right deleting trailing '0'.
shift lc_menge right deleting trailing '.'.
write lc_menge.
"2
data: menge type mseg-menge.
data: lc_menge type string.
lc_menge = '100000'."在这里赋了值
condense lc_menge."这种情况下,这句必须加
shift lc_menge right deleting trailing '0'.
shift lc_menge right deleting trailing '.'.
write lc_menge.
**********************************************************************去掉前边的字符
data text2(13) type c value '10.020'.
shift text2 left deleting leading '1'.
write text2.
* length of a string
DATA: int TYPE i,
word1(20) TYPE c VALUE '12345',
word2(20) TYPE c ,
word3(20) TYPE c VALUE ' 4 '.
int = strlen( word1 ). WRITE int.
int = strlen( word2 ). WRITE / int.
int = strlen( word3 ). WRITE / int.
SKIP.
ULINE.
* condensing strings
DATA: string9(25) TYPE c VALUE ' one two three four',
len9 TYPE i.
len9 = strlen( string9 ).
WRITE: string9, '!'.
WRITE: / 'Length: ', len9.
CONDENSE string9.
len9 = strlen( string9 ).
WRITE: string9, '!'.
WRITE: / 'Length: ', len9.
CONDENSE string9 NO-GAPS.
len9 = strlen( string9 ).
WRITE: string9, '!'.
WRITE: / 'Length: ', len9.
SKIP.
ULINE.
* concatenating strings
DATA: c1(10) TYPE c VALUE 'Sum',
c2(3) TYPE c VALUE 'mer',
c3(5) TYPE c VALUE 'holi ',
c4(10) TYPE c VALUE 'day',
c5(30) TYPE c ,
sep(3) TYPE c VALUE ' - '.
CONCATENATE c1 c2 c3 c4 INTO c5.
WRITE c5.
CONCATENATE c1 c2 c3 c4 INTO c5 SEPARATED BY sep.
WRITE / c5.
SKIP.
ULINE.
* splitting strings
DATA: string10(60) TYPE c ,
p1(20) TYPE c VALUE '++++++++++++++++++++',
p2(20) TYPE c VALUE '++++++++++++++++++++',
p3(20) TYPE c VALUE '++++++++++++++++++++',
p4(20) TYPE c VALUE '++++++++++++++++++++',
del10(3) TYPE c VALUE '***'.
string10 = ' Part 1 *** Part 2 *** Part 3 *** Part 4 *** Part 5'.
WRITE string10.
SPLIT string10 AT del10 INTO p1 p2 p3 p4.
WRITE / p1.
WRITE / p2.
WRITE / p3.
WRITE / p4.
SKIP.
ULINE.
* moving parts of strings
DATA: mc1(10) TYPE c VALUE 'ABCDEFGHIJ',
mc2(10) TYPE c .
MOVE mc1 TO mc2 PERCENTAGE 40.
WRITE mc2.
MOVE mc1 TO mc2 PERCENTAGE 40 RIGHT.
WRITE / mc2.
**********************************************************************短字符串赋值到长的空间布局:
DATA: string(20) TYPE c,
number(8) TYPE c VALUE '123456',
offset TYPE i VALUE 8,
length TYPE i VALUE 12.
WRITE number(6) TO string+offset(length) LEFT-JUSTIFIED.
WRITE: / string.
CLEAR string.
WRITE number(6) TO string+offset(length) CENTERED.
WRITE: / string.
CLEAR string.
WRITE number TO string+offset(length) RIGHT-JUSTIFIED.
WRITE: / string.
CLEAR string.
**********************************************************************CS string:包含字符串
DATA: text1(30) TYPE c VALUE 'This is the first text',
text2(30) TYPE c VALUE 'This is the second text',
text3(30) TYPE c VALUE 'This is the third text',
string(5) TYPE c VALUE 'eco'.
IF text1 CS string.
WRITE / 'Condition 1 is fulfilled'.
ELSEIF text2 CS string.
WRITE / 'Condition 2 is fulfilled'.
ELSEIF text3 CS string.
WRITE / 'Condition 3 is fulfilled'.
ELSE.
WRITE / 'No condition is fulfilled'.
ENDIF.
**********************************************************************varying.
DATA: BEGIN OF text,
word1(4) TYPE c VALUE 'This',
word2(4) TYPE c VALUE 'is',
word3(4) TYPE c VALUE 'a',
word4(4) TYPE c VALUE 'loop',
END OF text.
DATA: string1(4) TYPE c, string2(4) TYPE c.
DO 4 TIMES VARYING string1 FROM text-word1 NEXT text-word2.
WRITE string1. //这样也能读到text-word4.
IF string1 = 'is'.
string1 = 'was'.
ENDIF.
ENDDO.
SKIP.
DO 2 TIMES VARYING string1 FROM text-word1 NEXT text-word3
VARYING string2 FROM text-word2 NEXT text-word4.
WRITE: string1, string2.
ENDDO.
**********************************************************************
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。
replace first occureence of 'a' in l_str with 'b'."只替换第一次出现的
replace all occurrences of 'a' in l_str with 'b'. "替换所有出现的
常用场合:
字符串的替换操作比较常用,需要注意的是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中
常用场合:文件下载,对文件中的字段编辑。
*---字符串的连接
str = '1234567890123456789012345678901234567890123456789012345678901234567890' &
'我是我1234567890123456789012345678901234567890123456789012345678901234567890' .
//'& '的作用是使换行连接成一个字符串
*---字符串的反转
report z_barry_reverse no standard page heading .
data: c1(20) type c ,
c2(20) type c.
c1 = '赵兄托你帮我办点事'.
call function 'STRING_REVERSE'
exporting
string = c1
lang = '1'
importing
rstring = c2
exceptions
too_small = 1
others = 2.
write c2.
*---Comparison operators
data: str1 type string.
data: str2 type string value '1234567890'.
str1 = '1234'.
if str1 co str2. "Contains Only,str1仅由str2中的元素组成
write:/ 'co ok'.
endif.
str1 = '123a'.
if str1 cn str2. "Not Contains Only,str1不仅由str2中的元素组成
write:/ 'cn ok'.
endif.
str1 = 'fjsfjd7as;'.
if str1 ca str2. "Contains Any,str1至少包含str2中的一个元素
write:/ 'ca ok'.
endif.
str1 = 'fjsfjdas;'.
if str1 na str2. "Not Contains Any,str1不包含str2中的任何一个元素
write:/ 'na ok'.
endif.
str1 = '1234567890'.
if str1 cs str2. "Contains String,str1包含str2
write:/ 'cs ok'.
endif.
str1 = '123456789'.
if str1 ns str2. "Contains No String,str1不包含str2
write:/ 'ns ok'.
endif.
str1 = 'ABCDEFGH'.
str2 = '*C*F+H'.
if str1 cp str2."Covers Pattern,子串匹配:*代表多位多位,+代表一位字符
write:/ 'cp ok'.
endif.
str1 = 'ABCDEFGGH'.
str2 = '*C*F+H'.
if str1 np str2."Not Covers Pattern,子串不匹配:*代表多位多位,+代表一位字符
write:/ 'np ok'.
endif.
评论