четверг, 2 октября 2014 г.

Операции со строками текста

Конкатенация и разделение символьных строк
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".



Поиск символьных строк в поляхили внутренних таблицах
Предположим, нужно отыскать строку 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'.