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

发布时间:2026/7/22 15:49:38
字符串操作语句,数据的微调 * 字符串操作语句CONCATENATE-------- FIND------------REPLACE---------------SHIFTSPLIT----------------CONDENSE--------TRANSLATE-----------WRITE TOREPLACE ALL OCCURRENCES OF--------------concatenate[字符串拼接]DATA str type string. concatenate A B C into str. write str.输出结果为ABC *--------------------* str Aac. write str.输出结果为Aac *--------------------* str |{A}{B}{c}|. write str.输出结果为ABc *----------------------* str |{A}{Bcaselower}{c}|. write str.输出结果为Abc *---------------------------------------------------------------* concatenate A B Cinto str separated by space.用space(空格)隔开 write str.输出结果为A B C *----------------------------------------------------------------* concatenate A B Cinto str respecting blanks.保留字符常量(也可以是变量)中的空格 write str.输出结果为A BC *----------------------------------------------------------------* data str1 type c length 4. concatenate A B Cinto 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.字符串移位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的指定。可以首先获得该字符串的长度方法lenSTRLEN(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 选项可以按以下方式移动字段 ca.LEFT:向左移动 n 位置右边用n个空格填充默认设置 。b.RIGHT:向右移动n位置左边用n个空格填充 。c.CIRCULAR:向左移动 n 位置以便左边 n 个字符出现在右边。*语法SHIFT {c} UP TO {str} {mode} 把字符串中在str以前的字符都去掉同样可以指定modezchar 00AABBCCDD00.SHIFT zchar UP TO zcharstu RIGHT. 去掉指定字符串zcharstu右边的字符 输出00AABBCCDDzchar 00AABBCCDD00.SHIFT zchar UP TO zcharstu LEFT. 去掉指定字符串zcharstu左边的字符 输出DD00SHIFT 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位的字符里面放的是sopo等number而你不想显示前面的0那么就可以这样做SHIFT {c} LEFT DELETING LEADING 0.B已知某个字符串中包含固定的字符想把这个固定字符前面的字符删掉那么可以使用SHIFT {c} UP TO {str}。以上语句常用的场合A去掉字符串中的前导字符。例如如果alv中定一了一个字段是10位的字符里面放的是sopo等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.拓展也可以采用字符串xy的方式 : x表示从x开始y表示截取y个字符.例如 sy-datum0(4) 输出年份https://www.cnblogs.com/wh-cnblogs/p/15993777.html2.替换字符串内容语法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. 得到 ABC123GHI3.大小写的转换语法TRANSLATE c TO UPPER CASE. 转成大写TRANSLATE c TO LOWER CASE. 转成小写4.在字符串中寻找部分字符串语法SEARCH c FOR str示例DATA STRING(10) VALUE ABCDEFGHIJ.会回存至两个变量SY-SUBRC和SY-FDPOS若找到则SY-SUBRC为0 SY-FDPOS 存开始位置若找不到则SY-SUBRC为4SY-FDPOS为0SY-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_utilitiesdynamic_output_length( str1 ).6.取部分字符串语法f[o][l]从字符串f的o的下一个字符开始取l个字符示例DATA T(10) VALUE ABCDEFGHIJ. WRITE / T2(4). 得到 CDEF7.替换指定的*字符下面这个是只会替换第一个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中字符串处理方法小结一 | 摆渡SAP6, 覆盖字符字段OVERLAY------待续ABAP中字符串处理方法小结二 | 摆渡SAP3, 转换为可排序格式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_STRING30(RESULT).查找不到则会赋值为-110.查找字符串内表将内表中每行中存在指定字符的取出来放到一个新内表中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_sourceIN CHARACTER MODEIGNORING CASERESULTS lt_results.CATCH cx_sy_regex.* invalid regex - stop processingMESSAGE 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 ) ) ).