登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

原来为了你

我的人生就是要一次次的超越

 
 
 

日志

 
 
 
 

ABAP字符串操作  

2011-01-07 14:49:21|  分类: ABAP基础知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

* shifting strings by a given number of places

DATAt1(10TYPE c VALUE 'abcdefghij',
      string1 
LIKE t1.

string1 
t1.
WRITE string1.
SHIFT string1.
WRITE / string1.
string1 
t1.
SHIFT string1 BY PLACES LEFT.
WRITE / string1.
string1 
t1.
SHIFT string1 BY PLACES RIGHT.
WRITE / string1.
string1 
t1.
SHIFT string1 BY PLACES CIRCULAR.
WRITE / string1.

SKIP.
ULINE.

* shifting up to a given string

DATAt2(10TYPE c VALUE 'abcdefghij',
      string2 
LIKE t2,
      str2
(2TYPE 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

DATAt3(14TYPE c VALUE '    abcdefghij',
      string3 
LIKE t3,
      str3
(6TYPE 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

DATAt4(10TYPE c VALUE 'abcdefghij',
      string4 
LIKE t4,
      str41
(4TYPE c VALUE 'cdef',
      str42
(4TYPE c VALUE 'klmn',
      str43
(2TYPE c VALUE 'kl',
      str44
(6TYPE 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

DATAt5(10TYPE c VALUE 'AbCdEfGhIj',
      string5 
LIKE t5,
      rule5
(20TYPE 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

DATAt6(10TYPE c VALUE 'a c e g i ',
      string6 
LIKE t6,
      over6
(10TYPE c VALUE 'ABCDEFGHIJ',
      str6
(2TYPE 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(30TYPE 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.

*

DATAstring8(30TYPE 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 exceptionsYou 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.

下边这种情况:
datamenge type mseg-menge.
datalc_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的数据来自一个数量,它很奇怪地保护了数据不丢失,
但如果是一串字母,就很正常,没有这种奇怪的现象

比较12的区别:
"1
datamenge type mseg-menge.
datalc_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
datamenge type mseg-menge.
datalc_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(13type c value '10.020'.
shift text2 left deleting leading '1'.
write text2.


* length of a string

DATAint TYPE i,
      word1
(20TYPE c VALUE '12345',
      word2
(20TYPE c ,
      word3
(20TYPE c VALUE '   4         '.
int 
strlenword1 )WRITE   int.
int 
strlenword2 )WRITE / int.
int 
strlenword3 )WRITE / int.

SKIP.
ULINE.

* condensing strings

DATAstring9(25TYPE c VALUE ' one  two   three    four',
      len9 
TYPE i.

len9 
strlenstring9 ).
WRITEstring9'!'.
WRITE'Length: 'len9.
CONDENSE string9.
len9 
strlenstring9 ).
WRITEstring9'!'.
WRITE'Length: 'len9.
CONDENSE string9 NO-GAPS.
len9 
strlenstring9 ).
WRITEstring9'!'.
WRITE'Length: 'len9.

SKIP.
ULINE.

* concatenating strings

DATAc1(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

DATAstring10(60TYPE c ,
      p1
(20TYPE c VALUE '++++++++++++++++++++',
      p2
(20TYPE c VALUE '++++++++++++++++++++',
      p3
(20TYPE c VALUE '++++++++++++++++++++',
      p4
(20TYPE c VALUE '++++++++++++++++++++',
      del10
(3TYPE 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

DATAmc1(10TYPE c VALUE 'ABCDEFGHIJ',
      mc2
(10TYPE c .
MOVE mc1 TO mc2 PERCENTAGE 40.
WRITE mc2.
MOVE mc1 TO mc2 PERCENTAGE 40 RIGHT.
WRITE / mc2.

**********************************************************************短字符串赋值到长的空间布局:
DATAstring(20TYPE c,
      
number(8TYPE c VALUE '123456',
      offset 
TYPE i VALUE 8,
      length 
TYPE i VALUE 12.

WRITE number(6TO string+offset(lengthLEFT-JUSTIFIED.
WRITE/ string.
CLEAR string.

WRITE number(6TO string+offset(lengthCENTERED.
WRITE/ string.
CLEAR string.

WRITE number TO string+offset(lengthRIGHT-JUSTIFIED.
WRITE/ string.
CLEAR string.

**********************************************************************CS string:包含字符串
DATAtext1(30TYPE c VALUE 'This is the first text',
      text2
(30TYPE c VALUE 'This is the second text',
      text3
(30TYPE c VALUE 'This is the third text',
      string
(5TYPE 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.
DATABEGIN OF text,
        word1
(4TYPE c VALUE 'This',
        word2
(4TYPE c VALUE 'is',
        word3
(4TYPE c VALUE 'a',
        word4
(4TYPE c VALUE 'loop',
      
END OF text.

DATAstring1(4TYPE cstring2(4TYPE c.

DO TIMES VARYING string1 FROM text-word1 NEXT text-word2.
  
WRITE string1.             //这样也能读到text-word4.
  
IF string1 'is'.
    string1 
'was'.
  
ENDIF.
ENDDO.

SKIP.

DO TIMES VARYING string1 FROM text-word1 NEXT text-word3
           VARYING string2 
FROM text-word2 NEXT text-word4.
  
WRITEstring1string2.
ENDDO.

**********************************************************************
1
.对字符串的操作
1
.SHIFT:截断字符串
SHIFT {c} [BY {n} PLACES] [{mode}].
作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不变。如果n超出字符串的长度,则字符串变空,所以在做此操作的时候要注意n的指定。可以首先获得该字符串的长度,方法:lenSTRLEN(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位的字符,里面放的是soponumber,而你不想显示前面的0,那么就可以这样做:SHIFT {c} LEFT DELETING LEADING 0.
B
.已知某个字符串中包含固定的字符,想把这个固定字符前面的字符删掉,那么可以使用:SHIFT {c} UP TO {str}。例如:某个物料,通过增强mga00002mga00003对其加了前缀,这个前缀部分是在某固定值表中取得的数据,在具体显示中,要把其前缀去掉。如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-SUBRC0SY-FDPOS为找到字符串的具体位置。
需要说明的地方:注意模式的使用
指定str:查找strstr中后面的空格忽略
指定.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}.
作用:按照分割字符delc分割,然后放到内表中的相应字段
常用场合:
文件名的分割,根据完整的文件路径加文件名把文件名分割出来。
难点:无法确定要分割多少次.
解决方法:两两分割,到最后的那个就是了。例如: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.
文件上传的类型是字符串,把其分割后放到内表中。例如上面的问题:
databegin of itab occurs ,
col1
(30type 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…cns分隔连接到c
常用场合:文件下载,对文件中的字段编辑。

*---字符串的连接
str 
=  '1234567890123456789012345678901234567890123456789012345678901234567890' &
       
'我是我1234567890123456789012345678901234567890123456789012345678901234567890' .

//
'& '的作用是使换行连接成一个字符串

 

 

 


*---字符串的反转
report  z_barry_reverse no standard page heading  .

datac1(20type c ,
      c2
(20type c.

c1 
'赵兄托你帮我办点事'.

call function 'STRING_REVERSE'
  
exporting
    string    
c1
    lang      
'1'
  
importing
    rstring   
c2
  
exceptions
    too_small 
1
    
others    2.
write c2.

*---Comparison operators
datastr1 type string.
datastr2 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

  评论这张
 
阅读(1672)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018