Найти, удалить и извлечь дубликаты из внутренней таблицы - PullRequest
0 голосов
/ 06 марта 2019

У меня есть внутренняя таблица с 2 миллионами строк, которые были загружены из файла. Я хочу удалить все строки, которые являются дубликатами, и извлечь номера строк дубликатов и добавить их в другую таблицу. Какой лучший / самый эффективный способ сделать это с 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 Ответ

5 голосов
/ 06 марта 2019

Это код для поиска дубликатов строк (действительный> = 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` ) ).

Я использую LINES OF, чтобы не генерировать строки, если размер группы равен 1.

...