Конкатенация и
разделение символьных строк
CONCATENATE
Символьные строки
объединяются (конкатенируются) с помощью команды concatenate:
data: first (25), middla(2), last(25), full(54).
first = 'Con '.
middle = 'ca' .
last = ' tanate' .
concatenate first
middle last into full.
После выполнения этой
операции поле full будет содержать конкатенированную строку – ‘Concatanate’.
Если строки должны
иметь разделители (например, строки, содержащие каталоги и имя айла в пути
доступа), такой разделитель задается следующим образом:
data: directory_1(2),
directory_2 (10) , file_name(10) , path(24).
directory_l = ' a:'
.
directory_2 = 'usr' .
file_name = 'programs' .
concatenate
directory_1 direotory_2 filename into path separated by ' \ ' .
Содержимое path в
этом примере будет 'a:\usr\programs'. Система возвращает не равное нулю
значение переменной sy-subrc, если длина конкатенированной строки больше, чем
длина поля, в которое она записывается.
SPLIT
Обратная операция
разделения символьной строки осуществляется для произвольно выбранного
разделителя:
data: list(40), name_1(25) , name_2(25) , name_3(25)
.
l i s t = 'Edison,Smith,Young'.
split l
ist at ' , ' into name_l name_2
name_3.
В качестве
разделителей строк можно использовать различные символы, например пробел,
минус,или даже последовательность символов. Если одно из полей, в которые
записывается результат, имеет недостаточную длину, все компоненты усекаются и
переменная sy-subrc получает ненулевое значение.
Кроме того, если число
компонентов превышает число целевых полей, информация теряется, так как последнее
поле содержит всю оставшуюся часть строки. Чтобы не допустить этого, в качестве
целевого объекта используйте внутреннюю таблицу, которая может содержать любое
число строк:
data: names like name_1 occurs 10.
list = 'Edison,Smith,Young,Edwards' .
split list
at ' , ' into table names.
Внутренняя таблица names будет содержать четыре строки: Edison, Smith, Young
u Edwards.
Сдвиг числовых строк
SHIFT
Сдвинуть символьную строку
на один символ можно посредством команды shift, а на несколько символов - путем добавления by n places:
name_l = ' Edison' .
name 2 = ' Smith' .
name_3 = ' Young' .
shift name_l.
shift name_2 by 3 places.
shift name_3 right.
После этих операций поле
name_l будет содержать символьную строку dison, поле name_2 - th, a поле name_3 — Young (с начальными пробелами). Такие операции
очень удобны, если к анализу текста приступают не сначала, а с определенного
слова.
Если разработчик не
хочет указывать число байтов, на которое осуществляется сдвиг (возможно, он и
не знает его), можно использовать другие варианты команды shift.
Предположим,
необходимо отыскать подстроку внутри строки и сдвинуть всю строку до начала
этой подстроки:
names = 'Alexander Bill Charles' .
shift names up to ' Bill ' .
Так как подстрока
Bill найдена в поле names, после операции содержимое поля names будет Bill Charles. Если подстрока не найдена, строка остается
без изменения и система возвращает ненулевое значение переменной sy-subrc.
Аналогично, если поле должно быть сдвинуто вправо так, чтобы не содержать в
конце заданного символа, можно написать следующий программный фрагмент:
Name = ' Joanna
' .
shift name right deleting trailing space.
Эта команда shift
удаляет все пробелы после последнего значащего символа в поле name и возвращает
значение ‘ Joanne’. Значение space (пробел) является предварительно
определенным полем, содержащим пробелы.
Замена и
преобразование символов в строке
REPLACE
Для замены
определенных символов в строке используется команда replace, которая позволяет
замещать первый встретившийся символ (или подстроку) внутри строки:
string = 'Variable: fi. The variable & is
substituted later .
replace ' fi' with 'X' into string.
TRANSLATE
Поле string будет
равно Variable: X. The
variable & is substituted later. Для замены всех символов & на X вводится команда
translate:
translate string using '&X' .
Все символы & в
поле символьной строки будут заменены на X, т.е. строка будет иметь вид:
Variable: X. The
variable X is substituted later.
Команда translate
позволяет заменить сразу несколько символов в строке. Правило замены
записывается как последовательность пар, где первый символ всегда заменяется на
второй. Например, можно заменить все переменные в математической формуле:
expression = 'a ** 2
+ b ** 2 - с ** 2' .
translate expression
using 'axbycz' .
Результатом замены будет выражение х ** 2 + у ** 2 – z ** 2.
Команда translate позволяет изменить регистр строки. Например:
DATA text TYPE string.
text = `Careful with that Axe, Eugene`.
TRANSLATE text TO UPPER CASE
text = `Careful with that Axe, Eugene`.
TRANSLATE text TO UPPER CASE
После преобразования переменная text будет
содержать значение "CAREFUL WITH
THAT AXE, EUGENE".
Поиск символьных строк в поляхили
внутренних таблицах
Предположим, нужно отыскать строку California в символьном поле:
text = 'Texas California Mew Mexico Louisiana Oregon'.
search text for '
California' .
if sy-subrc ne 0.
write
'Not found'.
endif.
Поиск закончится успешно, и системный код возврата (sy-subrc) будет равен
нулю. Кроме того, системное поле sy-fdpos содержит сдвиг найденной строки
относительно начала (в этом примере sy-fdpos = 6). Команда search не различает
символы верхнего и нижнего регистров, поэтому следующий оператор поиска
завершится тоже успешно:
search text for
'cAliforniA' .
Можно искать подстроки, содержащие пробелы:
search text for 'New
M' .
В результате выполнения этого оператора код возврата sy-subrc будет равен
0, а код sy-fdpos = 17.
Чтобы определить, содержится ли подстрока с заключительными пробелами в
символьной строке, заключите подстроку в символы "точка":
data: string(6)
value 'АВАР/4' .
search string for '
./4 .' .
Заданный шаблон ./4_. не совпадает с содержимым поля, так как в поле
string нет заключительного пробела, однако поиск /4_ закончится успешно.
В АВАР/4 поддерживается поиск символьных строк во внутренних таблицах.
Предположим, во внутренней таблице letter содержится текст письма:
types text_line(80)
.
data letter type text_line
occurs 100.
Пусть первая строка письма letter равна Dear Sir, а вторая — thank you
for your letter of 12/31/1999.
Оператор имеет вид:
search letter for
'you'.
В этом случае оператор даст следующий результат: sy-subrc - 0, sy-tabix -
2, sy-fdpos - 6. Системное поле sy-tabix возвращает индекс строки таблицы,
содержащей искомую строку, a sy-fdpos — сдвиг относительно начала этой строки.
Креме того, дополнения команды search позволяют ограничить диапазон поиска
строк:
search letter for 'thank' starting at 2 ending at 100.
search letter for 'Sincerely' starting at 3.
Первый оператор ограничивает поиск строками от второй до сотой, для
второго ператора поиск будет производится
по всем строкам, начиная с третьей.
STRLEN
Эта функция возвращает длину строки в символах.
Пример использования:
data str(30) value 'INDIA IS GREAT'.
data len type i.
len = STRLEN( STR ).
Значение len = 14.
CONDENSE
Эта функция используется для удаления пробелов в строке, с помощью дополнения NO-GAPS можно убрать все
пробелы в том числе и из средины строки.
Пример использования:
data str(30) value ' INDIA IS GREAT'.
CONDENSE STR.
Результат 'INDIA IS GREAT'.