news 2026/7/22 15:49:24

字符串操作语句,数据的微调

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
字符串操作语句,数据的微调

* 字符串操作语句

CONCATENATE-------- FIND------------REPLACE---------------SHIFT

SPLIT----------------CONDENSE--------TRANSLATE-----------WRITE TO

REPLACE ALL OCCURRENCES OF--------------&&

concatenate[字符串拼接]

DATA str type string. concatenate 'A' 'B' 'C' into str. write str."输出结果为ABC *--------------------* str = 'A'&'a'&'c'. write str.输出结果为Aac *--------------------* str =|{'A'}{'B'}{'c'}|. write str.输出结果为ABc *----------------------* str =|{'A'}{'B'case=lower}{'c'}|. write str."输出结果为Abc *---------------------------------------------------------------* concatenate 'A' 'B' 'C'into str separated by space."用space(空格)隔开 write str."输出结果为A B C *----------------------------------------------------------------* concatenate 'A' ' B' 'C'into str respecting blanks."保留字符常量(也可以是变量)中的空格 write str."输出结果为A BC *----------------------------------------------------------------* data str1 type c length 4. concatenate 'A' ' B' 'C'into str1 respecting blanks."保留字符常量(也可以是变量)中的空格 write str."输出结果为A 合并的字符串长度大于4导致数据遗失 write sy-subrc."结果为4,合并的字符串长度大于4 *----------------------------------------------------------------* DATA: title_1(10) VALUE 'Tutorials', title_2(10) VALUE 'Point', spaced_title(30) VALUE 'Tutorials Point Limited', sep, dest1(30), dest2(30). CONCATENATE title_1 title_2 INTO dest1."将两个字符串变量拼接到一个变量上 Write: / 'Concatenation:', dest1. "输出结果为Concatenation: TutorialsPoint CONCATENATE title_1 title_2 INTO dest2 SEPARATED BY sep. Write: / 'Concatenation with Space:', dest2. *输出结果为Concatenation with Space: Tutorials Point CONDENSE spaced_title. Write: / 'Condense with Gaps:', spaced_title. *输出结果为Condense with Gaps: Tutorials Point Limited CONDENSE spaced_title NO-GAPS. Write: / 'Condense with No Gaps:', spaced_title. *输出结果为Condense with No Gaps: TutorialsPointLimited

find[字符串查找]

find 'bcd' in 'abcde'."查找bcd是否在abcde中 write sy-subrc."结果为零表示查找成功 write sy-abcde."结果为26个字母 write sy-abcde +0(3)."结果为abc [注释]0这里做起始位置的索引()中写要取的单位 write sy-abcde(3)."与上述结果相同

字符串数据处理

1.字符串移位
https://www.cnblogs.com/tb176/p/3876482.html
语法:
SHIFT <c> [BY <n> PLACES] [<modes>]
<modes>: (1).空白,字符串往左移一位
(2).LEFT,字符串往左移n
(3).RIGHT,字符串往右移n
(4).CIRCULAR,字符串以环状方式移位
示例:
DATA STRING(10) VALUE 'ABCDEFGHIJ'. SHIFT STRING. "得到 BCDEFGHIJ SHIFT STRING BY 2 PLACES RIGHT. "得到 ABCDEFGH DATA : zchar(12) TYPE c VALUE '00AABBCCDD00'. SHIFT zchar. "去掉左边第一位

SHIFT:截断字符串
SHIFT {c} [BY {n} PLACES] [{mode}].:
作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不变。如果n超出字符串的长度,则字符串变空,所以在做 此操作的时候要注意n的指定。可以首先获得该字符串的长度,方法:len=STRLEN(C)。
Mode:指定字符串截断的方向。
LEFT:从左边截断
RIGHT:从右边截断
CIRCULAR:把左边的字符放到右边。

*语法 : SHIFT {c} [BY {n} PLACES] [{mode}].
*c: 字符串
*n: 去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不变。如果n超出字符串的长度,则字符串变空
*Mode:指定字符串截断的方向。 LEFT:从左边截断 RIGHT:从右边截断
zchar = '00AABBCCDD00'.
SHIFT zchar BY 3 PLACES RIGHT. "去掉右边三位

SHIFT <c> [BY <n> PLACES] [<mode>].

按照给定位置数移动字符串

该语句将字段 <c> 移动 <n> 个位置。如果省略 BY <n> PLACES, 则将<n>解释为一个位置。如果<n> 是 0 或负值,则<c>保持不变。如果<n>超过<c>长度,则<c>用空格填充 。<n> 可为变量。

对不同(<mode>) 选项,可以按以下方式移动字段 <c>:a.LEFT:向左移动 <n> 位置,右边用<n>个空格填充(默认设置 )。b.RIGHT:向右移动<n>位置,左边用<n>个空格填充 。c.CIRCULAR:向左移动 <n> 位置,以便左边 <n> 个字符出现在右边。

*语法:SHIFT {c} UP TO {str} {mode} 把字符串中在str以前的字符都去掉,同样可以指定mode
zchar = '00AABBCCDD00'.
SHIFT zchar UP TO zcharstu RIGHT. "去掉指定字符串zcharstu右边的字符 输出00AABBCCDD
zchar = '00AABBCCDD00'.
SHIFT zchar UP TO zcharstu LEFT. "去掉指定字符串zcharstu左边的字符 输出DD00

SHIFT <c> UP TO <str> <mode>. ABAP/4 查找<c>字段内容直到找到字符串 <str> 并将字段<c> 移动到字段边缘。 <mode> 选项与按给定位置数移动字段串中所述相同。<str> 可为变量。

如果 <c> 中找不到 <str>, 则将SY-SUBRC 设置为 4 并且不移动 <c>。否则,将 SY-SUBRC 设置为0。

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

假设第一个或最后一个字符符合一定条件,则可用 SHIFT 语句将字段向左或向右移动。为此,请使用以下语法: SHIFT <c> LEFT DELETING LEADING <str>. SHIFT <c> RIGHT DELETING TRAILING <str>. 假设左边的第一个字符或右边的最后一个字符出现在 <str> 中,该语句将字段 <c> 向左或向右移动。字段右边或左边用空格填充。<str> 可为变量。

SHIFT {c} LEFT DELETING LEADING {str}.
SHIFT {c} RIGHT DELETING TRAILING {str}.:
作用:这两个语句就是把字符串c中前的(LEFT)或者后的(RIGHT)的字符str都去掉。

*这两个语句就是把字符串c中前的(LEFT)或者后的(RIGHT)的字符str都去掉。

zchar = '00AABBCCDD00'.

SHIFT zchar LEFT DELETING LEADING zcharstu. "只能去掉最左边的字符,如果zcharstu是中间或者右边而不是最左边则无法删除

zchar = '00AABBCCDD00'.

SHIFT zchar RIGHT DELETING TRAILING zcharstu. "只能去掉最右边的字符,如果zcharstu是中间或者左边而不是最右边则无法删除

SHIFT A LEFT DELETING LEADING B.
SHIFT A RIGHT DELETING TRAILING B
假设左边的第一个字符或右边的最后一个字符出现在 B 中,该语句将字段A 向左或向右移动。字段右边或左边用空格填充。
注意SHIFT后的变量A必须为string类型*
例如:
去掉字符串最右边的/

例如:
去掉字符串最右边的/

以上语句常用的场合:
A.去掉字符串中的前导字符。例如:如果alv中定一了一个字段是10位的字符,里面放的是so,po等number,而你不想显示前面的0,那么就可以这样做:

SHIFT {c} LEFT DELETING LEADING 0.
B.已知某个字符串中包含固定的字符,想把这个固定字符前面的字符删掉,那么可以使用:

SHIFT {c} UP TO {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'.

拓展:
也可以采用字符串+x(y)的方式 : x表示从x开始,y表示截取y个字符.

例如: sy-datum+0(4) 输出年份











https://www.cnblogs.com/wh-cnblogs/p/15993777.html

2.替换字符串内容
语法:
REPLACE <string1> WITH <string2> INTO <c>
将字符串<c>中的<string1><string2>来取代
示例:
DATA: STRING(10) VALUE 'ABCDEFGHI', STR1(3) VALUE 'DEF', STR2(3) VALUE '123'. REPLACE STR1 WITH STR2 INTO STRING. WRITE / STRING. "得到 ABC123GHI
3.大小写的转换
语法:
TRANSLATE <c> TO UPPER CASE. "转成大写
TRANSLATE <c> TO LOWER CASE. "转成小写
4.在字符串中寻找部分字符串
语法:
SEARCH <c> FOR <str>
示例:
DATA STRING(10) VALUE 'ABCDEFGHIJ'.
会回存至两个变量,SY-SUBRCSY-FDPOS
若找到则SY-SUBRC0 ,SY-FDPOS 存开始位置,
若找不到则SY-SUBRC4SY-FDPOS0
SY-SUBRC "系统执行返回值,0表示成功4表示失败
5.字符串长度
语法:
STRLEN(<c>)
示例:
INT = STRLEN('XYZABC'). "得到 6 INT = STRLEN('ABC'). "得到 3

获取字符串长度STRLEN( ) 是获取字符串的字符长度也就是字符数,dynamic_output_length( )是获取字符串的输出长度,它会考虑到字符串在输出时的实际长度。对于非英文字符(如中文字符),通常会占据两个字符的位置,因此输出长度会相应地增加。
a. 使用 STRLEN( )

DATA lv_string TYPE string VALUE 'AB中国'. "STRLEN( )函数用于获取 字符串字符数量 lv_len 为4 data(lv_len) = STRLEN( lv_string ).

使用 类

DATA str1 TYPE string VALUE 'AB中国'. "lv_len为6 每个中文占两个字符 data(lv_len) = cl_abap_list_utilities=>dynamic_output_length( str1 ).
6.取部分字符串
语法:
<f>[+<o>][<l>]
从字符串<f><o>的下一个字符开始取<l>个字符
示例:
DATA T(10) VALUE 'ABCDEFGHIJ'. WRITE / T+2(4). "得到 'CDEF'
7.替换指定的*字符

下面这个是只会替换第一个

DATA lv_test TYPE string VALUE '122222'. REPLACE FIRST OCCURRENCE OF '1' IN lv_test WITH '2'. WRITE lv_test."122222->222222 REPLACE `,` IN <comp> WITH ``. "只会替换一个
去掉一个指定的*字符

REPLACE ALL OCCURRENCES OF '字符' with ''.

示例:

Data lv_s type MATNR. lv_s = '111*$22'. REPLACE ALL OCCURRENCES OF '*' IN lv_s WITH space. BREAK-POINT.

结果:

字符串替换

REPLACE ALL OCCURRENCES OF 'A' IN lv_string WITH 'B'. (将lv_string 中所有A 换为B )
IF sy-subrc = 0.
ENDIF.

REPLACE ALL OCCURRENCES OF 'ABC' IN lv_string WITH space. (将lv_string 中 所有 ABC 换为 空 )
IF sy-subrc = 0.
ENDIF.

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

ABAP中字符串处理方法小结(一) | 摆渡SAP

6, 覆盖字符字段OVERLAY------待续
ABAP中字符串处理方法小结(二) | 摆渡SAP

3, 转换为可排序格式CONVERT TEXT -----待续

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

<str1>、 <str2> 和 <l> 可为变量。

(REGEX 表示使用正则 \d 表示单个字符 \w+ 表示多个字符 )

REPLACE ALL OCCURRENCES OF REGEX ' rownumber="\d"' IN lv_string WITH ''.
REPLACE ALL OCCURRENCES OF REGEX 'rownumber=(")(\w+)(")' IN lv_xml WITH ''.
IF sy-subrc = 0.
ENDIF.

8.删除字符串中指定字符(或字符串)
DATA(LV_STRING1) = CONV STRing( 'HELLO WORLD ABCDU12U3' ). CONDENSE LV_STRING1. REPLACE ALL OCCURRENCES OF 'U' IN LV_STRING1 WITH ''. WRITE:/ LV_STRING1.

9.寻找第一个符合或不再符合字符位置(或字符串)
DATA(LV_STRING3) = CONV STRing( 'HELLO WORLD ABCDU12U3' ). DATA(RESULT) = FIND_ANY_OF( VAL = LV_STRING3 SUB = 'U' ). DATA(RESULT0) = find_end( VAL = LV_STRING3 regex = 'U' ). DATA(RESULT1) = FIND_ANY_not_OF( VAL = LV_STRING3 SUB = 'U' ). LV_STRING3 = LV_STRING3+0(RESULT).

查找不到则会赋值为-1

10.查找字符串内表,将内表中每行中存在指定字符的取出来放到一个新内表中
DATA:lt_results TYPE match_result_tab, lv_sstring TYPE text255. SELECT-OPTIONS sstring FOR lv_sstring NO INTERVALS MODIF ID dsp. DATA: ls_sstring LIKE LINE OF sstring. FIND ALL OCCURRENCES OF ls_sstring-low IN TABLE gt_source IN CHARACTER MODE IGNORING CASE RESULTS lt_results.

TRY.
FIND ALL OCCURRENCES OF REGEX ls_sstring-low IN TABLE gt_source
IN CHARACTER MODE
IGNORING CASE
RESULTS lt_results.
CATCH cx_sy_regex.
* invalid regex -> stop processing
MESSAGE s384 WITH ls_sstring-low DISPLAY LIKE 'E'.
RAISE EXCEPTION TYPE lcx_scan_exceptions.
ENDTRY.

10.分割字符串

DATA: lv_str TYPE string VALUE 'steel_rods'."要分割的字符串 DATA: lv_res1 TYPE string,"结果存储到的目标字段1 lv_res2 TYPE string."结果存储到的目标字段2 SPLIT lv_str AT '_' INTO lv_res1 lv_res2."按照符号 _ 进行分割 存储到 lv_res1 lv_res2 中。 * 如果分隔符位于字符串的首或尾,那么拆分后的结果可能会包含一个空字符串。 WRITE: lv_res1,lv_res2."打印结果::steel rods 存储到内表中 DATA:lv_string TYPE string. DATA :BEGIN OF ls_string,"声明一个结构只有一个字段col1 col1 TYPE char50, END OF ls_string. DATA:lt_string LIKE STANDARD TABLE OF ls_string."参照上面的结构声明一个STANDARD(标准)内表 *不加STANDARD就声明的是通用表,通用表的类型可以是标准表,也可以是排序表或者哈希表,具体取决于赋值给它的数据对象的类型。 *也就是说 当一个排序表赋值给一个通用表的时候 这个通用表就会变为排序表就具有排序表的行为,如按照键值排序等。其它情况也如此。 lv_string = '1,2,3,4'."要分割的字符串 SPLIT lv_string AT ',' INTO TABLE lt_string."将字符串按照逗号分割存入内表中 LOOP AT lt_string INTO ls_string."循环打印内表中的结果 WRITE:/ ls_string-col1. ENDLOOP.

10.正负号,负号前置,正数添加+

DATA:LABST1 TYPE ZPPT090_LOG-LABST VALUE '-10000.00'. DATA:LABST2 TYPE ZPPT090_LOG-LABST . DATA:LABST3 TYPE string . DATA:LABST4 TYPE i VALUE '10010' . LABST2 = |{ LABST1 sign = LEFTPLUS }|. LABST3 = |{ LABST1 sign = LEFTPLUS }|. LABST3 = |{ LABST4 sign = LEFTPLUS }|. BREAK-POINT.

11.替换字符串中(指定单个字符替换)

DEFINE ICON_PREPARE_FOR_MODIFY. * trunkate ICON_ID, e.g. '@3M@' --> '3M' TRANSLATE &1 USING '@ '. CONDENSE &1 NO-GAPS. END-OF-DEFINITION.
DATA text TYPE string. text = `Barbcbdbarb`. TRANSLATE text USING 'ABBAabba'. "Conversion of the characters "A" to "B", "a" to "b" and the other way round. After "implementation, text contains "Abracadabra".

正则表达式的使用

https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abenregex_syntax_specials.htm

待续

补前导零-去零-补末尾零

通过函数补零

data: lv_c3 TYPE char3, lv_cnt TYPE i. lv_c3 = lv_cnt + 1. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = lv_c3 IMPORTING output = lv_c3.

新语法补零去零

lv_in = |{ lv_matnr ALPHA = IN WIDTH = 18 }| .可以指定长度补零到对应长度.

DATA(lv_in) = |{ lv_matnr ALPHA = IN }| .添加前导零

out 表示从内部未转化的 变成 外部数据的意思。

DATA(lv_out) = |{ lv_matnr ALPHA = OUT }| .”删除前导零

通过数据类型补零

当使用BDC时两位数字是你可以靠定义N类型长度为2的

DATA(n) = CONV char2( CONV /bcv/uif_dashb_item( lines( lt_a017 ) ) ).

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 15:47:45

详解C++中移动语义的概念与使用

过去写 C/C 代码&#xff0c;大家对数据做传递时&#xff0c;都习惯先拷贝再赋值。比如&#xff0c;把数据从 t1 复制到 t2&#xff0c;复制完成后 t2 和 t1 的状态是一致的&#xff0c;t1 状态没变。这里的状态指的是对象内部的非静态成员数据集合。 在程序运行过程中&#x…

作者头像 李华
网站建设 2026/7/22 15:44:25

GEO优化不是堆词,广拓时代解析AI推荐的语义路径

很多企业以为GEO优化就是把“AI搜索”“GEO优化”“品牌推荐”这些词多写几遍。其实&#xff0c;在AI大模型的理解逻辑里&#xff0c;词出现多少次并不是核心&#xff0c;词和问题、场景、证据之间有没有关系&#xff0c;才更关键。 AI不只是匹配关键词&#xff0c;它会判断内容…

作者头像 李华
网站建设 2026/7/22 15:42:52

麒麟信安“一云多芯”解决方案,助力传统IT架构变革转型

随着信息化进程的不断演变推进&#xff0c;各行各业的信息化水平均有显著提高&#xff0c;IT系统建设规模不断扩大、硬件设备需求逐渐增加&#xff0c;因此给数据安全管理和高效运维带来的压力不容小觑&#xff1a; 1.难防 每个人的数据均保存在本地&#xff0c;虽然大部分单位…

作者头像 李华
网站建设 2026/7/22 15:41:12

【小程序课程设计/毕业设计】基于SpringBoot的教学辅助型在线模拟考试平台设计 智慧校园移动端考试实训管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华