在字符串 table 中搜索子字符串?
Searching a substring in an string table?
- 我有一个内部 table,其中包含以下数据 (
<fs_content>
):
OFFER/005056B467AE1ED9B1962F12360477E9-A
OFFER/005056B467AE1ED9B1962F12360477E9-B
OFFER/005056B467AE1ED9B1962F12360477E9-C
OFFER/005056B467AE1ED9B1962F12360477E9-D
OFFER/005056B467AE1ED9B1962F12360477E9-E
- 我必须反复搜索这样的值 (
V1
):
OFFER-A
OFFER-B
OFFER-C
OFFER-M
OFFER-L
- 我希望识别出以下值,它们与内部 table (
itab_v1_result
) 中的一行相匹配:
OFFER-A
OFFER-B
OFFER-C
但是正如您在 <fs_content>
中所见,在 OFFER/
之后 -
符号处有相同的代码 005056B467AE1ED9B1962F12360477E9
。
现在,我想通过将 V1
值与 <fs_content>
中的每一行进行比较,将 <fs_content>
中的行分配给字段符号 <fs_my_content>
,但问题是V1
值与 <fs_content>
行不完全相同。
我试过这样做,但没有用,<fs_my_content>
总是空的:
READ TABLE <fs_content> ASSIGNING <fs_my_content> WITH KEY ('ATTR_NAME') = V1.
如何让 itab_v1_result
包含我期望的内容?
我的最小可重现示例:
TYPES:
BEGIN OF ty_content,
attr_name TYPE string,
END OF ty_content.
FIELD-SYMBOLS:
<fs_my_content> TYPE any,
<fs_content> TYPE ANY TABLE.
DATA:
itab_content TYPE STANDARD TABLE OF ty_content,
itab_v1 TYPE STANDARD TABLE OF string,
itab_v1_result TYPE STANDARD TABLE OF string,
v1 TYPE string.
itab_content = VALUE #(
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-A' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-B' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F123604D7E9-C' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-D' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-E' ) ).
itab_v1 = VALUE #(
( `OFFER-A` )
( `OFFER-B` )
( `OFFER-C` )
( `OFFER-M` )
( `OFFER-L` ) ).
ASSIGN itab_content TO <fs_content>.
LOOP AT itab_v1 INTO v1.
READ TABLE <fs_content> ASSIGNING <fs_my_content> WITH KEY ('ATTR_NAME') = v1.
IF sy-subrc = 0.
APPEND v1 TO itab_v1_result.
ENDIF.
ENDLOOP.
" Here, itab_v1_result is empty unfortunately!?
您不能在 READ TABLE
中使用除 =
以外的任何运算符。但是您可以在 LOOP
中使用它们。
首先你得按照CS
可以识别的方式排列你的V1,所以只用'-X',这似乎是独一无二的。然后你可以在 LOOP
子句中使用你的条件。
offset = STRLEN( v1 ) - 2.
v2 = v1+offset(2).
LOOP AT itab1 ASSIGNING <fs_itab1> WHERE attribute_name CS v2.
" do something
" if you only want to do it for the first entry you find, then just EXIT afterwards
ENDLOOP.
非常感谢大家提供各种解决方案。对我很有帮助。
这是我的问题的解决方案。
- 首先我们应该在
<fs_content>
处循环并将其分配给新的字段符号 <dynamic_content>
.
- 然后,我们应该从
<dynamic_content>
中得到 ATTR_NAME
字段并将其分配给另一个字段符号 <contact_attribute_name>
.
- 我们将使用一些函数来处理
STRING
类型的值,因此我们将 <contact_attribute_name>
分配给 lv_attr_name
。
- 正如我们所知(从任务描述中)在
lv_attr_name
中的值将是:OFFER/005056B467AE1ED9B1962F12360477E9-A
等等。
因此我们会从lv_attr_name
的开头通过find()
的方法找到第一个/
的位置,并将值放入lv_slash_position
.
我们重复这个操作找到第一个-
在lv_slash_position
之后的位置,并将值放入lv_dash_position
。
在这两个操作之后,我们将使用replace()
方法并将lv_dash_position - lv_slash_position
替换为empty
值。最后我们会得到 OFFER/-A
并将其放入 lv_attr_val_string
.
最后我们会比较lv_attr_val_string
和v1
,如果lv_attr_val_string <> v1
我们不会把它放在最后的itab itab_v1_result
,否则我们会做它。
LOOP AT <fs_content> ASSIGNING <dynamic_content>.
ASSIGN COMPONENT 'ATTR_NAME' OF STRUCTURE <dynamic_content> TO <contact_attribute_name>.
DATA(lv_attr_name) = CONV string( <contact_attribute_name> ).
DATA(lv_slash_position) = find( val = lv_attr_val_string
sub = '/'
off = 0 ).
IF lv_slash_position <> '1-'.
DATA(lv_dash_position) = find( val = lv_attr_val_string
sub = '-'
off = lv_slash_position ).
lv_attr_val_string = replace( val = lv_attr_val_string
off = lv_slash_position
len = ( lv_dash_position - lv_slash_position )
with = '' ).
ENDIF.
IF lv_attr_val_string <> v1.
APPEND v1 TO itab_v1_result.
CONTINUE.
ENDIF.
ENDLOOP.
您使解决方案过于复杂。为什么不直接使用 substring access?
LOOP AT itab_v1 INTO v1.
LOOP AT itab_content ASSIGNING FIELD-SYMBOL(<content>).
CHECK v1(5) = <content>-attr_name(5) AND substring( val = v1 off = strlen( v1 ) - 1 len = 1 ) = substring( val = <content>-attr_name off = strlen( <content>-attr_name ) - 1 len = 1 ).
APPEND v1 TO itab_v1_result.
ENDLOOP.
ENDLOOP.
- 我有一个内部 table,其中包含以下数据 (
<fs_content>
):
OFFER/005056B467AE1ED9B1962F12360477E9-A
OFFER/005056B467AE1ED9B1962F12360477E9-B
OFFER/005056B467AE1ED9B1962F12360477E9-C
OFFER/005056B467AE1ED9B1962F12360477E9-D
OFFER/005056B467AE1ED9B1962F12360477E9-E
- 我必须反复搜索这样的值 (
V1
):
OFFER-A
OFFER-B
OFFER-C
OFFER-M
OFFER-L
- 我希望识别出以下值,它们与内部 table (
itab_v1_result
) 中的一行相匹配:
OFFER-A
OFFER-B
OFFER-C
但是正如您在 <fs_content>
中所见,在 OFFER/
之后 -
符号处有相同的代码 005056B467AE1ED9B1962F12360477E9
。
现在,我想通过将 V1
值与 <fs_content>
中的每一行进行比较,将 <fs_content>
中的行分配给字段符号 <fs_my_content>
,但问题是V1
值与 <fs_content>
行不完全相同。
我试过这样做,但没有用,<fs_my_content>
总是空的:
READ TABLE <fs_content> ASSIGNING <fs_my_content> WITH KEY ('ATTR_NAME') = V1.
如何让 itab_v1_result
包含我期望的内容?
我的最小可重现示例:
TYPES:
BEGIN OF ty_content,
attr_name TYPE string,
END OF ty_content.
FIELD-SYMBOLS:
<fs_my_content> TYPE any,
<fs_content> TYPE ANY TABLE.
DATA:
itab_content TYPE STANDARD TABLE OF ty_content,
itab_v1 TYPE STANDARD TABLE OF string,
itab_v1_result TYPE STANDARD TABLE OF string,
v1 TYPE string.
itab_content = VALUE #(
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-A' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-B' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F123604D7E9-C' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-D' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-E' ) ).
itab_v1 = VALUE #(
( `OFFER-A` )
( `OFFER-B` )
( `OFFER-C` )
( `OFFER-M` )
( `OFFER-L` ) ).
ASSIGN itab_content TO <fs_content>.
LOOP AT itab_v1 INTO v1.
READ TABLE <fs_content> ASSIGNING <fs_my_content> WITH KEY ('ATTR_NAME') = v1.
IF sy-subrc = 0.
APPEND v1 TO itab_v1_result.
ENDIF.
ENDLOOP.
" Here, itab_v1_result is empty unfortunately!?
您不能在 READ TABLE
中使用除 =
以外的任何运算符。但是您可以在 LOOP
中使用它们。
首先你得按照CS
可以识别的方式排列你的V1,所以只用'-X',这似乎是独一无二的。然后你可以在 LOOP
子句中使用你的条件。
offset = STRLEN( v1 ) - 2.
v2 = v1+offset(2).
LOOP AT itab1 ASSIGNING <fs_itab1> WHERE attribute_name CS v2.
" do something
" if you only want to do it for the first entry you find, then just EXIT afterwards
ENDLOOP.
非常感谢大家提供各种解决方案。对我很有帮助。
这是我的问题的解决方案。
- 首先我们应该在
<fs_content>
处循环并将其分配给新的字段符号<dynamic_content>
. - 然后,我们应该从
<dynamic_content>
中得到ATTR_NAME
字段并将其分配给另一个字段符号<contact_attribute_name>
. - 我们将使用一些函数来处理
STRING
类型的值,因此我们将<contact_attribute_name>
分配给lv_attr_name
。 - 正如我们所知(从任务描述中)在
lv_attr_name
中的值将是:OFFER/005056B467AE1ED9B1962F12360477E9-A
等等。 因此我们会从lv_attr_name
的开头通过find()
的方法找到第一个/
的位置,并将值放入lv_slash_position
.
我们重复这个操作找到第一个-
在lv_slash_position
之后的位置,并将值放入lv_dash_position
。
在这两个操作之后,我们将使用replace()
方法并将lv_dash_position - lv_slash_position
替换为empty
值。最后我们会得到 OFFER/-A
并将其放入 lv_attr_val_string
.
最后我们会比较lv_attr_val_string
和v1
,如果lv_attr_val_string <> v1
我们不会把它放在最后的itab itab_v1_result
,否则我们会做它。
LOOP AT <fs_content> ASSIGNING <dynamic_content>.
ASSIGN COMPONENT 'ATTR_NAME' OF STRUCTURE <dynamic_content> TO <contact_attribute_name>.
DATA(lv_attr_name) = CONV string( <contact_attribute_name> ).
DATA(lv_slash_position) = find( val = lv_attr_val_string
sub = '/'
off = 0 ).
IF lv_slash_position <> '1-'.
DATA(lv_dash_position) = find( val = lv_attr_val_string
sub = '-'
off = lv_slash_position ).
lv_attr_val_string = replace( val = lv_attr_val_string
off = lv_slash_position
len = ( lv_dash_position - lv_slash_position )
with = '' ).
ENDIF.
IF lv_attr_val_string <> v1.
APPEND v1 TO itab_v1_result.
CONTINUE.
ENDIF.
ENDLOOP.
您使解决方案过于复杂。为什么不直接使用 substring access?
LOOP AT itab_v1 INTO v1.
LOOP AT itab_content ASSIGNING FIELD-SYMBOL(<content>).
CHECK v1(5) = <content>-attr_name(5) AND substring( val = v1 off = strlen( v1 ) - 1 len = 1 ) = substring( val = <content>-attr_name off = strlen( <content>-attr_name ) - 1 len = 1 ).
APPEND v1 TO itab_v1_result.
ENDLOOP.
ENDLOOP.