ABAP字符串操作

移动字段内容

按给定位置数移动字符串
SHIFT <c> [BY <n> PLACES] [<mode>]. 

该语句将字段<c>移动<n>个位置。如果省略BY <n> PLACES,则将<n>解释为一个位置。如果<n>是0或负值,则<c>保持不变。如果 <n> 超过 <c>长度,则 <c> 用空格填充。<n> 可为变量。
对不同(<mode>)选项,可以按以下方式移动字段 <c>:

   LEFT:向左移动<n>位置,右边用<n>个空格填充(默认设置)。

   RIGHT:向右移动<n> 位置,左边用<n>个空格填充。

   CIRCULAR:向左移动<n>位置,以便左边<n>个字符出现在右边。

* shifting strings by a given number of places

DATA: t1(10TYPE 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.

输出如下:
abcdefghij
bcdefghij
defghij
   abcdefg
defghijabc


移动字符串到给定串

SHIFT <c> UP TO <str> <mode>. 

ABAP/4 查找<c>字段内容直到找到字符串<str> 并将字段<c>移动到字段边缘。<mode> 选项与上述相同。<str> 可为变量。
如果 <c> 中找不到<str>,则将SY-SUBRC设置为 4 并且不移动 <c>。否则,将SY-SUBRC设置为0。

* shifting up to a given string

DATA: t2(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.

输出如下:
abcdefghij
efghij
efghij
    abcdef
efghijabcd


根据第一个或最后一个字符移动字段串

SHIFT <c> LEFT  DELETING LEADING  <str>.

SHIFT <c> RIGHT DELETING TRAILING <str>.

假设左边的第一个字符或右边的最后一个字符出现在 <str> 中,该语句将字段 <c> 向左或向右移动。字段右边或左边用空格填充 。<str>可为变量。


* shifting a string depending on the first or last sign

DATA: t3(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.

输出如下:

   abcdefghij

abcdefghij

        abcdef


替换字段内容

REPLACE <str1> WITH <str2> INTO <c> [LENGTH <l>].

ABAP/4 搜索字段 <c> 中模式 <str1> 前 <l> 个位置第一次出现的地方。如果未指定长度,按全长度搜索模式 <str1>。
然后,语句将模式 <str1> 在字段 <c> 中第一次出现的位置用字符串<str2> 替换。如果指定长度<l>,则只替换模式的相关部分。
如果将系统字段 SY-SUBRC 的返回代码设置为0, 则说明在 <c> 中找到 <str1> 且已用<str2> 替换。非 0 的返回代码值意味着未替换。
<str1>、<str2> 和 <len> 可为变量。


* replacing values
DATA: t4(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.

输出如下:

abcdefghij

abklmnghij

abklmnefgh

abklghij

abklmnopgh

转换大/小写并替换字符

TRANSLATE <c> TO UPPER CASE.

TRANSLATE <c> TO LOWER CASE.

这些语句将字段 <c>中的所有小写字母转换成大写或反之。

TRANSLATE <c> USING <r>.

该语句根据字段 <r> 中存储的替换规则替换字段 <c> 的所有字符 。<r> 包含成对字母,其中每对的第一个字母用第二个字母替换 。<r> 可为变量。


* translating signs
DATA: t5( 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.

输出如下:

AbCdEfGhIj

ABCDEFGHIJ

abcdefghij

xXyYzZGhIj

转换为可排序格式

CONVERTTEXT <c> INTO SORTABLE CODE <sc>.

该语句为字符字段<c>填充可排序目标字段<sc>。 字段<c>必须是类型C且字段<sc> 必须是类型X,最小长度为<c>长度的16倍。
该语句目的是为字符字段<c>创建相关字段<sc>,作为<c>的按字母顺序排列的排序关键字。在内表的内容和已解压缩的数据中进行排序。
如果对未转换的字符字段进行排序,则系统创建与各字母的特定平台内部编码相对应的顺序。在对目标字段进行排序之后,转换CONVERTTEXT按这样的方式创建目标字段,相应的字符字段顺序按字母排序。例如 ,在德语中,顺序为‘ Miller、 Moller、 M ller、 Muller’ ,而不是‘ Miller、 Moller、 Muller、 M ller’。
转换方法依赖于运行ABAP/4程序的文本环境。文本环境在用户主记录中定义。例外的是可以使用如下语句, 在程序中设置文本环境:

SETLOCALE LANGUAGE <lg> [COUNTRY <cy>] [MODIFIER <m>].

该语句根据语言<lg> 设置文本环境。对于选项COUNTRY,只要特定国家语言不同,就可以在语言以外指定国家。对于选项MODIFIER,只要一个国家内语言不同,就可以指定另一个标识符,例如,排序顺序在电话簿和词典之间不同。
字段<lg>、<cy>和<m>必须是类型C且长度必须与表TCP0C的关键字段长度相等。TCP0C是一个Table,维护平台相关的文本环境。在语句SET LOCALE期间,系统根据TCP0C中的条目设置文本环境。除了内部传送的平台特性之外,用SET语句指定表关键字。如果<lg>等于SPACE,则系统根据用户主记录设置文本环境。如果对于指定的关键字在表中无条目,则系统将产生运行错误。
文本环境影响ABAP/4中依赖于字符集的所有操作。


覆盖字符字段

OVERLAY <c1> WITH <c2> [ONLY <str>].

该语句用<c2> 的内容覆盖字段 <c1> 中包含<str> 中字母的所有位置。<c2> 保持不变。如果省略 ONLY<str>, 则覆盖字段 <c1> 中所有包含空格的位置。
如果至少要替换<c1>中的一个字符,则将 SY-SUBRC 设置为0。对于所有其它情况,将SY-SUBRC设置为4。如果<c1> 比 <c2> 长,则只覆盖<c2>中的长度。


* overlaying strings

DATA: t6(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.

输出如下:
a c e g i
ABCDEFGHIJ
aBcDeFgHiJ
A c e g I

搜索字符串

SEARCH <c> FOR <str> <options>.

该语句在字段 <c>中搜索<str> 中的字符串。如果成功,则将 SY-SUBRC 的返回代码值设置为0并 将 SY-FDPOS 设置为字段 <c>中该字符串的偏移量。否则将 SY-SUBRC 设置为4。搜索串 <str> 可为下列格式之一:

<str>

目 的

<pattern>

搜索 <pattern>(任何字符顺序)。忽略尾部空格。

 .<pattern>.

搜索 <pattern> ,但是不忽略尾部空格。

*<pattern>

搜索以 <pattern> 结尾的词。

 <pattern>*

搜索以 <pattern> 开始的词。

 单词之间用空格、逗号、句号、分号、冒号、问号、叹号、括号、斜杠、加号和等号等分隔。


*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'.

输出如下:
Searched SY-SUBRC SY-FDPOS
__________________________

X            4        0
itt          0       11
.e .         0       15
*e           0       10
s*           0       17

搜索字符字段 <c> 的各种选项(<options>)如下

   ABBREVIATED

在字段 <c>中搜索包含 <str> 中指定字符串的单词,其中字符可能被其它字符隔开。单词和字符串 的第一个字母必须相同。

   STARTINGAT <n1>

在字段 <c>中搜索从 <n1> 开始的<str>。结果 SY-FDPOS 参照相对于<n1> 的偏移量而不是字段的开始。

   ENDINGAT <n2>

在字段 <c> 搜索 <str> 直到位置 <n2>。

   ANDMARK

如果找到搜索串,则将搜索串中的所有字符(和使用ABBREVIATED时的所有字符)转换为大写形式。

 

DATA: string8(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.

输出如下:
This is a fast first example.
SY-FDPOS:    10
This is a fast FIRST example.
SY-FDPOS:     4
Off:         15

获得字符串长度

[COMPUTE]<n> = STRLEN( <c> ).

STRLEN将操作数 <c> 作为字符数据类型处理,而不考虑其实际类型。不进行转换。关键字COMPUTE 可选。


* length of a string

DATA: int TYPE i,
      word1(20TYPE c VALUE '12345',
      word2(20TYPE c ,
      word3(20TYPE c VALUE '   4         '.
int = strlen( word1 ). WRITE   int.
int = strlen( word2 ). WRITE / int.
int = strlen( word3 ). WRITE / int.

 结果分别是 5,0 和 4。


压缩字段内容

CONDENSE <c> [NO-GAPS].

该语句去除字段<c>中的前导空格并用一个空格替换其它空格序列。结果是左对齐单词,每个单词用空格隔开。如果指定附加的NO-GAPS,则去除所有空格。


* condensing strings

DATA: string9(25TYPE 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.

输出如下:
 one  two   three    four !
Length:          25  one two three four        !
Length:          18  onetwothreefour           !
Length:          15

连接字符串

CONDENSE <c> [NO-GAPS].

该语句去除字段<c>中的前导空格并用一个空格替换其它空格序列。结果是左对齐单词,每个单词用空格隔开。如果指定附加的NO-GAPS,则去除所有空格。

CONCATENATE <c1> ... <cn> INTO <c> [SEPARATED BY <s>].

该语句连接字符串<c1>与<cn>并将结果赋给<c>。
该操作忽略尾部空格。
附加SEPARATED BY <s>允许指定字符字段<s>,它放置在单个字段间已定义的长度中。
如果结果符合 <c>,则将SY-SUBRC设置为0。然而,如果结果必须被截断,则将SY-SUBRC设置为4。


* 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.

输出如下:
Summerholiday
Sum - mer - holi - day

拆分字符串
SPLIT <c> AT <del> INTO <c1> ... <cn>.
该语句在字符字段<c>搜索分界字符串<del>,并将分界符之前和之后的部分放到目标字段<c1>... <cn> 中。
要将所有部分放到不同目标字段中,必须指定足够目标字段。否则,用字段<c>的剩余部分填充最后目标字段并包含分界符。
如果所有目标字段足够长且不必截断任何部分,则将SY-SUBRC设置为0。否则,将其设置为4。

* splitting strings
DATA: string10(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.

输出如下:

Part 1 *** Part 2 *** Part 3 *** Part 4 *** Part 5
Part 1
Part 2
Part 3
Part 4 *** Part 5

分配字符串部分

MOVE <c1> TO <c2> PERCENTAGE <p> [RIGHT].

将左对齐的字符字段<c1>的百分比<p>(或如果用RIGHT选项指定,则为右对齐)复制到<c2>。
<p>值可为0和100之间的任何数。将要从<f1>复制的长度取整为下一个整数。
如果语句中某一参数不是类型 C,则忽略参数PERCENTAGE。


* moving parts of strings

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

输出如下:

ABCD     

     ABCD




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值