从内部表中查找,删除和提取重复项

时间:2019-03-06 13:56:59

标签: sap abap

我有一个内部表,其中有200万行是从文件中上传的。我想删除所有重复的行,并提取重复的行号并将其添加到另一个表中。用ABAP 7.40做到这一点的最佳/最有效方法是什么?经典ABAP也可以。

所以这是我原始表的一个示例,我想通过比较A和B列来查找重复项

A  | B  | C
-----------
a1 | b1 | c1
a1 | b2 | c1
a2 | b1 | C2
a1 | b1 | c2
a2 | b2 | c2

第1行和第4行是重复的,因此我想将它们都删除以得到

A  | B  | C
-----------
a1 | b2 | c1
a2 | b1 | C2
a2 | b2 | c2

,还有另一个存储重复项的表:

Row number  | Error 
-------------------
1           | Duplicate
4           | Duplicate      

我在此站点上看到了类似的请求,但是它们的工作方式与我需要的有所不同。谢谢。

1 个答案:

答案 0 :(得分:5)

这是查找哪些行重复的代码(有效> = 7.40):

TYPES : BEGIN OF ty_line,
          a TYPE c LENGTH 2,
          b TYPE c LENGTH 2,
          c TYPE c LENGTH 2,
        END OF ty_line,
        ty_lines TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY.

DATA(itab) = VALUE ty_lines(
( a = 'a1' b = 'b1' c = 'c1' )
( a = 'a1' b = 'b2' c = 'c1' )
( a = 'a2' b = 'b1' c = 'c2' )
( a = 'a1' b = 'b1' c = 'c2' )
( a = 'a2' b = 'b2' c = 'c2' ) ).

DATA(duplicates) = VALUE string_table(
    FOR GROUPS <group> OF <line> IN itab
    GROUP BY ( a = <line>-a b = <line>-b size = GROUP SIZE )
    ( LINES OF COND #( WHEN <group>-size > 1 THEN VALUE string_table( (
        concat_lines_of(
            table = VALUE string_table( 
                    FOR <line2> IN GROUP <group> INDEX INTO tabix ( |{ tabix }| ) )
            sep   = ',' ) ) ) ) ) ).

ASSERT duplicates = VALUE string_table( ( `1,4` ) ).

如果组的大小为1,我将使用LINES OF不生成一行。