Заставьте concat_lines_of () работать для rawstring - PullRequest
2 голосов
/ 09 мая 2019

Я конвертирую некоторый код.В прошлом использовалась строка, теперь должна использоваться rawstring.

Это работало со строкой, но теперь не работает с rawstring:

data my_table TYPE TABLE OF rawstring.
concat_lines_of( table = my_table sep = `, `)

Как заставить работать вышеупомянутые строки?

В моем случае rawstring содержит данные в кодировке utf8.

Результат должен быть xstring (последовательность байтов)

Это не имеет значения, но в Python это будет выглядеть так:

my_list = [my_byte_sequence1, my_byte_sequence2, my_byte_sequence3]
big_byte_sequence = b', '.join(my_list)

Ответы [ 2 ]

5 голосов
/ 09 мая 2019

Классический запрос состоит в том, чтобы просто объединить таблицу байтов в строку байтов, таким образом добавление запятой для идентификации исходных строк не имеет смысла, поскольку невозможно сохранить запятую как символ (альтернатива: закодировать ее в заданной кодовой странице).

Если вопрос просто классический запрос, то для типа XSTRING нет эквивалента CONCAT_LINES_OF.

Один обходной путь должен использовать REDUCE:

DATA my_table TYPE TABLE OF xstring.

my_table = VALUE #( ( CONV #( '01FF' ) ) ( CONV #( 'BEEF' ) ) ).

DATA(my_xstring) = REDUCE #(
      INIT aux TYPE xstring
      FOR <x> IN my_table
      NEXT aux = COND #( WHEN aux IS INITIAL THEN <x> ELSE aux && <x> ) ).

ASSERT my_xstring = '01FFBEEF'.
2 голосов
/ 10 мая 2019

Учитывая, что у вас есть эти входные данные:

  • таблица строк байтов, содержащих символы, закодированные в данной кодовой странице
  • имя данной кодовой страницы
  • символ разделителя, используемый для разделения каждой строки в выходных данных

Требуется следующий вывод:

  • строка байтов, содержащая все строки, объединенные и разделенные разделителем в данномкодовая страница

Этого можно достичь с помощью этого кода:

TYPES ty_table TYPE STANDARD TABLE OF xstring WITH EMPTY KEY.
DATA: my_table   TYPE ty_table,
      my_xstring TYPE xstring.

my_table = VALUE #( ( CONV #( '01FF' ) ) ( CONV #( 'BEEF' ) ) ).
PERFORM proc USING my_table `, ` 'UTF-8' CHANGING my_xstring.
ASSERT my_xstring = '01FF2C20BEEF'.


FORM proc 
      USING
        itab       TYPE ty_table 
        sep        TYPE csequence 
        codepage   TYPE string
      CHANGING
        my_xstring TYPE xstring.

  DATA(xsep) = cl_abap_codepage=>convert_to( source = sep codepage = codepage ).

  my_xstring = REDUCE #(
      INIT aux TYPE xstring
      FOR <x> IN my_table
      NEXT aux = COND #( WHEN aux IS INITIAL THEN <x> ELSE |{ aux }{ xsep }{ <x> }| ) ).

ENDFORM.
...