ABAP语法基础篇(5)——字符串处理
五、字符串
5.1 移动字符串
5.1 .1 按给定位置数移动字符串
要按给定位置数移动字段内容,使⽤ SHIFT 语句,⽤法如下:
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>个字符出现在右边。
5.1.2 移动字符串到给定串位置
要移动字段内容以到给定串位置,则使⽤ SHIFT 语句,⽤法如下:
SHIFT <c> UP TO <str><mode>.
ABAP/4 查<c>字段内容直到到字符串<str>并将字段<c>移动到字段边缘。<mode>选项与按给定位置数移动字符串中所述相同,<str>可为变量。
如果<c>中不到<str>,则将SY-SUBRC设置为 4 并且不移动<c>。否则,将SY-SUBRC设置为 0 。
5.1.3 根据第⼀个或最后⼀个字符移动字符串
假设第⼀个或最后⼀个字符符合⼀定条件,则可⽤SHIFT语句将字段向左或向右移动。为此,请使⽤以下语法:
SHIFT <c>LEFT DELETING LEADING <str>.
SHIFT <c> RIGHT DELETING TRAILING <str>.
假设左边的第⼀个字符或右边的最后⼀个字符出现在<str>中,该语句将字段<c>向左或向右移动。字段
右边或左边⽤空格填充,<str>可为变量。
5.2 替换字段内容
要⽤其它字符串替换字段串的某些部分,使⽤REPLACE语句。
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>可为变量。
5.3 ⼤⼩写转换并替换字符串
可以将字母转换⼤ / ⼩写或使⽤替换规则。要转换⼤ / ⼩写,使⽤TRANSLATE 语句,⽤法如下:
TRANSLATE <c> TO UPPER CASE.
TRANSLATE <c> TO LOWER CASE.
这些语句将字段<c>中的所有⼩写字母转换成⼤写或反之。
使⽤替换规则时,使⽤以下语法:
TRANSLATE <c> USING <r>.
该语句根据字段<r>中存储的替换规则替换字段<c>的所有字符。<r>包含成对字母,其中每对的第⼀个字母⽤第⼆个字母替换。<r>可为变量。
5.4 转换为可排序格式
可以将字符字段转换为可按字母顺序排列的格式:
CONVERT TEXT <c> INTO SORTABLE CODE <sc>.
该语句为字符字段<c>填充可排序⽬标字段<sc>。字段<c>必须是类型C且字段<sc>必须是类型X ,最⼩长度为<c>长度的 16 倍。
该语句⽬的是为字符字段<c>创建相关字段<sc>,作为<c>的按字母顺序排列的排序关键字。在内表的
内容和已解压缩的数据中进⾏排序。
如果对未转换的字符字段进⾏排序,则系统创建与各字母的特定平台内部编码相对应的顺序。在对⽬标字段进⾏排序之后,转换CONVERT TEXT按这样的⽅式创建⽬标字段,相应的字符字段顺序按字母排序。例如,在德语中,顺序为Miller 、 Moller 、 Mller 、 Muller ,⽽不是 Miller 、Moller 、 Muller 、 Mller 。
转换⽅法依赖于运⾏ ABAP/4程序的⽂本环境。⽂本环境在⽤户主记录中定义。例外的是可以使⽤如下语句,在程序中设置⽂本环境:
SET LOCALE LANGUAGE <lg> [COUNTRY <cy>] [MODIFIER <m>].
该语句根据语⾔<lg>设置⽂本环境。对于选项COUNTRY,只要特定国家语⾔不同,就可以在语⾔以外指定国家。对于选项MODIFIER,只要⼀个国家内语⾔不同,就可以指定另⼀个标识符,例如,排序顺序在电话簿和词典之间不同。
字段<lg>、<cy>和<m>必须是类型C且长度必须与表TCP0C的关键字段长度相等。表TCP0C是⼀个表格,从中进⾏平台相关的⽂本环境维护。在语句SET LOCALE期间,系统根据TCP0C中的条⽬设置⽂本环境。除了内部传送的平台特性之外,⽤SET语句指定表关键字。如果
<lg>等于SPACE,则系统根据⽤户主记录设置⽂本环境。如果对于指定的关键字在表中⽆条⽬,则系统将产⽣运⾏错误。
⽂本环境影响 ABAP/4 中依赖于字符集的所有操作。
5.5 覆盖字符字段
要⽤另⼀字符字段覆盖字符字段,使⽤OVERLAY语句,⽤法如下:
OVERLAY <c1> WITH <c2> [ONLY <str>].
该语句⽤<c2>的内容覆盖字段<c1>中包含<str>中字母的所有位置。<c2>保持不变。如果省略ONLY <str>,则覆盖字段<c1>中所有包含空格的位置。
如果⾄少要替换<c1>中的⼀个字符,则将SY-SUBRC设置为 0。对于所有其它情况,将SY-SUBRC设置为 4 。如果<c1>⽐<c2>长,则只覆盖<c2>中的长度。
5.6 搜索字符串
要搜索特定模式的字符串,请使⽤SEARCH语句,⽤法如下:
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> 开始的词
单词之间⽤空格、逗号、句号、分号、冒号、问号、叹号、括号、斜杠、加号和等号等分隔。
搜索字符字段<c>的各种选项<options>如下:
ABBREVIATED
在字段<c>中搜索包含<str>中指定字符串的单词,其中字符可能被其它字符隔开。单词和字符串的第⼀个字母必须相同。
STARTING AT <n1>
在字段<c>中搜索从<n1>开始的<str>。结果SY-FDPOS参照相对于<n1>的偏移量⽽不是字段的开始。
ENDING AT <n2>
在字段<c>搜索<str>直到位置。
AND MARK
如果到搜索串,则将搜索串中的所有字符(和使⽤ ABBREVIATED时的所有字符)转换为⼤写形式。
5.7 获得字符串长度
要决定字符串到最后⼀个字符⽽不是SPACE的长度,使⽤内部函数STRLEN,⽤法如下:
[COMPUTE] <n> = STRLEN(<c> ).
字段字符串去重复
STRLEN将操作数<c>作为字符数据类型处理,⽽不考虑其实际类型,不进⾏转换。关键字COMPUTE可选。
5.8 压缩字符串去空格
要删除字符字段中多余空格,使⽤CONDENSE语句,⽤法如下:
CONDENSE <c> [NO-GAPS].
该语句去除字段<c>中的前导空格并⽤⼀个空格替换其它空格序列。结果是左对齐单词,每个单词⽤空格隔开。如果指定附加的NO-GAPS,则去除所有空格。
5.9 连接字符串
要将单个字符串连接成⼀体,使⽤CONCATENATE语句,⽤法如下:
CONCATENATE <c1> ... <cn> INTO <c> [SEPARATED BY <s>].
该语句连接字符串<c1>与<cn>并将结果赋给<c>。
该操作忽略尾部空格,附加SEPARATED BY <s> 允许指定字符字段<s>,它放置在单个字段间已定义的
长度中。
如果结果符合<c>,则将SY-SUBRC设置为 0 。然⽽,如果结果必须被截断,则将SY-SUBRC设置为 4 。
5.10 拆分字符串
要将字符串拆分成两个或更多⼩串,使⽤SPLIT语句,⽤法如下:
SPLIT <c> AT <del> INTO <c1> ... <cn>.
该语句在字符字段<c>搜索分界字符串<del>,并将分界符之前和之后的部分放到⽬标字段<c1> ... <cn>中。
要将所有部分放到不同⽬标字段中,必须指定⾜够⽬标字段。否则,⽤字段<c>的剩余部分填充最后⽬标字段并包含分界符。
如果所有⽬标字段⾜够长且不必截断任何部分,则将SY-SUBRC设置为 0 ,否则,将其设置为 4 。
5.11 分配字符串部分
MOVE语句的以下变体只使⽤类型C字段:
MOVE <c1> TO <c2> PERCENTAGE <p> [RIGHT].
将左对齐的字符字段<c1>的百分⽐<p>(或如果⽤RIGHT选项指定,则为右对齐)复制到<c2>。
<p>值可为0和100之间的任何数。将要从<f1>复制的长度取整为下⼀个整数。
如果语句中某⼀参数不是类型C,则忽略参数PERCENTAGE。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。