* 字符串操作语句
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: TutorialsPointLimitedfind[字符串查找]
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.字符串移位
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.替换字符串内容
DATA: STRING(10) VALUE 'ABCDEFGHI', STR1(3) VALUE 'DEF', STR2(3) VALUE '123'. REPLACE STR1 WITH STR2 INTO STRING. WRITE / STRING. "得到 ABC123GHI3.大小写的转换
4.在字符串中寻找部分字符串
DATA STRING(10) VALUE 'ABCDEFGHIJ'.5.字符串长度
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.取部分字符串
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 ) ) ).