字串首字元索引為 0; Character Fields: C,N, D, T, string (CNDT=> CN Data Time)
1. 字串串連
CONCATENATE dobj1 dobj2 ... INTO result
[IN { BYTE | CHARACTER } MODE]
[SEPARATED BY sep].
2.字串分隔, split 一個string的部分到一個內表或一系列的變數
SPLIT dobj AT sep INTO
{ {result1 result2 ...} | {TABLE result_tab} }
[IN {BYTE|CHARACTER} MODE].
3. 字串尋找, 在一個字串中尋找模式串(FIND or SEARCH)
FIND sub_string
IN SECTION [OFFSET off] [LENGTH len] OF dobj --> 灰色部分用來縮小目的串被尋找的範圍
[ IN { BYTE | CHARACTER } MODE ]
[ { RESPECTING | IGNORING } CASE ]
[ MATCH OFFSET moff ] [MATCH LENGTH mlen ].
FIND 'knows'
IN SECTION OFFSET 5 OF 'Everybody knows this is nowhere'
MATCH OFFSET moff " => moff = 10
MATCH LENGTH mlen. " => mlen= 5
在字串dobj中尋找pattern
SEARCH dobj FOR pattern [IN { BYTE | CHARACTER } MODE]
[STARTING AT p1] [ENDING AT p2]
[ABBREVIATED]
[AND MARK].
if sy-subrc = 0. then SY-FDPOS = 返回pattern在dobj中的位置
About pattern:
'pat' - 忽略尾部空格
'.pat.' -不忽略尾部空格
'*pat' - 以pat結尾
'pat*' - 以pat開始
單詞是指: 用 空格 , ; : ? ! () / + =分隔的字串
4. 字串替換
REPLACE SECTION [OFFSET off] [LENGTH len]
OF dobj WITH new
[IN { BYTE | CHARACTER } MODE].
REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF]
[SUBSTRING] sub_string
IN [SECTION [OFFSET off] [LENGTH len] OF ] dobj WITH new
[IN {BYTE|CHARACTER} MODE]
[{RESPECTING|IGNORING} CASE]
[REPLACEMENT COUNT rcnt]
[REPLACEMENT OFFSET roff]
[REPLACEMENT LENGTH rlen].
eg:
DATA: text1 TYPE string VALUE 'xababx'.
REPLACE 'ab' IN text1 WITH 'xx'. --> xxxabx
5. 去前置0 (Remove leading zero)
SHIFT dobj LEFT DELETING LEADING '0'.
FM : CONVERSION_EXIT_ALPHA_OUTPUT
增前置0 (Add leading zero)
DATA v_s(5).
UNPACK '123' to v_s. ==> v_s = '00123'
FM: CONVERSION_EXIT_ALPHA_INPUT
SHIFT dobj
[{BY num PLACES} | {UP TO sub_string}]
[LEFT|RIGHT] [CIRCULAR]
SHIFT dobj
{LEFT DELETING LEADING} | {RIGHT DELETING TRAILING} pattern.
[IN {BYTE|CHARACTER} MODE].
6. 字串的長度, 內表的行數
STRLEN( dobj) 字串的長度
LINES( itab ) 內表的行數
7. 刪字串中的空格: CONDENSE text [NO-GAPS].
8. 大小寫轉換,字元變換
TRANSLATE text {TO {UPPER|LOWER} CASE} | {USING pattern}.
eg: text = `Barbcbdbarb`.
TRANSLATE text USING 'ABBAabba'. =>'Abracadabra'
9. CONVERT
CONVERT DATE dat [TIME tim [DAYLIGHT SAVING TIME dst]]
INTO TIME STAMP time_stamp TIME ZONE tz.
CONVERT TIME STAMP time_stamp TIME ZONE tz
INTO [DATE dat] [TIME tim]
[DAYLIGHT SAVING TIME dst].
CONVERT TEXT text INTO SORTABLE CODE hex.
10. OVERLAY text1 WITH text2 [ONLY pattern].
如果不指定後面的ONLY pattern, text1中的空格會被text2中的對應字元替代
如果指定只有匹配的字元才會被替代,注意大小寫敏感
11. 模式比對
CO / CN contains only or not
CA / NA contains any or not any
CS / NS contain string or not
CP / NP contains pattern or not
NOTE:
a) . CO, NO, CA, NA比較時區分大小寫, 並且尾部空格也在比較的範圍之內
data: s1(10) value 'aabb'.
if s1 co 'ab' ==> false
if s1 co 'ab ' ==>true
CS, NS, CP, NP不區分大小寫和尾部空格
b) .對於CP, NP
* = \s?
+ = \s
# 換碼字元, 用於匹配 *, +這樣的字元
##
#*
#+
#___ 比較結尾空格
#[a-z] 在CP, NP中強制區分大小寫
c) . 比較結束後,如果結果為真,sy-fdpos將給出s2在s1中的位移量資訊
12. 特殊字元
在字串中加入斷行符號換行或TAB字元,在其他語言可以使用$13$10這樣的ASCII碼進行插入.但在ABAP中要使用sap的類CL_ABAP_CHAR_UTILITIES. 裡面有字元常量:CR_LF,HORIZONTAL_TAB,NEWLINE等等.
13. 字串位操作
DATA: v_s(10) value 'abcd'.
v_s+0(1) = 'b'.
v_s+2(*) = '12'.
=> v_s = 'bb12'.
============================================================
============================================================
ABAP對字串的操作方法與其他語言的操作有較大差別,以下是較常用的對字串操作的方法:
1. 字串的連接:CONCATENATE
DATA: t1 TYPE c LENGTH 10 VALUE 'We',
t2 TYPE c LENGTH 10 VALUE 'have',
t3 TYPE c LENGTH 10 VALUE 'all',
t4 TYPE c LENGTH 10 VALUE 'the',
t5 TYPE c LENGTH 10 VALUE 'time',
t6 TYPE c LENGTH 10 VALUE 'in',
t7 TYPE c LENGTH 10 VALUE 'the',
t8 TYPE c LENGTH 10 VALUE 'world',
result TYPE string.
CONCATENATE t1 t2 t3 t4 t5 t6 t7 t8 INTO result. "直接連接
CONCATENATE t1 t2 t3 t4 t5 t6 t7 t8 INTO result SEPARATED BY space. "用空格將每個字串連接
2. 拆分字串: SPLIT
DATA: str1 TYPE string,
str2 TYPE string,
str3 TYPE string,
itab TYPE TABLE OF string,
text TYPE string.
text = `What a drag it is getting old`.
SPLIT text AT space INTO: str1 str2 str3,
TABLE itab.
3. 去除多餘的空格:CONDENSE
DATA: BEGIN OF sentence,
word1 TYPE c LENGTH 30 VALUE 'She',
word2 TYPE c LENGTH 30 VALUE 'feeds',
word3 TYPE c LENGTH 30 VALUE 'you',
word4 TYPE c LENGTH 30 VALUE 'tea',
word5 TYPE c LENGTH 30 VALUE 'and',
word6 TYPE c LENGTH 30 VALUE 'oranges',
END OF sentence,
text TYPE string.
text = sentence.
CONDENSE text.“在每個連接串中間會有一個空格
CONDENSE text No-GAPS. "在後面加入NO-GAPS後,所有空格都會去除。
4.字串轉換:TRANSLATE
DATA text TYPE string.
text = `Careful with that Axe, Eugene`.
TRANSLATE text TO UPPER CASE. "轉大寫
TRANSLATE text TO LOWER CASE. "轉小寫
DATA text TYPE string.
text = `Barbcbdbarb`.
TRANSLATE text USING 'ABBAabba'. “A與B換轉 a與b換轉
5.取字串長度:STRLEN
data text type c length 20.
data: ilen type i.
text = `Barbcbdbarb`.
ilen = strlen( text ). "字串實際長度(11)
describe field text length ilen in byte mode. "字串定義時的字節長度,一個長度等2個字節(40)
describe field text length ilen in character mode. "字串定義的長度(20)
6.截取子字串
data: text type c length 10.
data: ilen type i.
data: subtext type c length 5.
text = 'ABCDEFGHIJ'.
subtext = text+0(5). "取左邊5個字元('ABCDE')
subtext = text+3(5). "從第四個字串起取5個字元('DEFGH)
text+0(1) = 'Z'. "將第一個字元變爲'Z'
注意:+兩邊不能有空格。
REPORT Z124101.
DATA string7(30) TYPE c VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.
ULINE /1(26).
SEARCH string7 FOR 'X'.
WRITE: / 'X', sy-subrc UNDER 'SY-SUBRC',
sy-fdpos UNDER 'SY-FDPOS'.
write:/ '看這裡的資料'.
1).SHIFT:截斷字串
SHIFT {c} [BY {n} PLACES] [{mode}].:
作用:去掉字串的前n個位置的字元,如果n未指定,預設為1,如果指定的n小於等於0,則字串不變。如果n超出字串的長度,則字串變空,所以在做 此操作的時候要注意n的指定。可以首先獲得該字串的長度,方法:len=STRLEN(C)。
Mode:指定字串截斷的方向。
LEFT:從左邊截斷
RIGHT:從右邊截斷
CIRCULAR:把左邊的字元放到右邊。
SHIFT {c} UP TO {str} {mode}.:
作用:把字串中在str以前的字元都去掉,同樣可以指定mode,原理同上。
SHIFT {c} LEFT DELETING LEADING {str}.
SHIFT {c} RIGHT DELETING TRAILING {str}.:
作用:這兩個語句就是把字串c中前的(LEFT)或者後的(RIGHT)的字元str都去掉。
以上語句常用的場合:
A.去掉字串中的前置字元。例如:如果alv中定一了一個欄位是10位的字元,裡面放的是so,po等number,而你不想顯示前面的0,那麼就可以這樣做:SHIFT {c} LEFT DELETING LEADING 0.
B.已知某個字串中包含固定的字元,想把這個固定字元前面的字元刪掉,那麼可以使用:SHIFT {c} UP TO {str}。例如:某個物料,通過增強mga00002和mga00003對其加了首碼,這個首碼部分是在某固定值表中取得的資料,在具體顯示中,要把其 首碼去掉。如TE-MRP-MAT1中想把te去掉,mrp表示該物料是跑mrp的,需求要求把te-去掉,mrp可以在固定值表中取得,則可以使用 SHIFT {c} UP TO 'MRP'.
2).REPLACE:替換字串
REPLACE {str1} WITH {str2} INTO {c} [LENGTH {l}].:
作用:把字串c中的str1替換成str2,如果指定l,就是指定了替換的長度。如果替換成功,則SY-SUBRC設定成0。
常用場合:
字串的替換操作比較常用,需要注意的是l的指定長度。
3). TRANSLATE:轉換字串
TRANSLATE {c} TO UPPER CASE.
TRANSLATE {c} TO LOWER CASE.:
作用:字串的大小寫轉換
TRANSLATE {c} USING {r}. :
作用:根據規則r轉換字串c
常用場合:
Sap系統一般都是使用大寫字母的,但是某些特定的欄位卻是用小寫字母來標記的,在操作這些欄位的時候就需要注意大小寫轉換了。轉換規則倒是不太常用,到現在我還沒有遇到過。
4). SEARCH:尋找字串
SEARCH {c} FOR {str} {options}.:
作用:在字串c中尋找str,如果找到了,SY-SUBRC為0,SY-FDPOS為找到字串的具體位置。
需要說明的地方:注意模式的使用
指定str:尋找str,str中後面的空格忽略
指定.str.:尋找str,包含了str中尾部的空格
指定*str:尋找以str結尾的字串
指定str*:尋找以str開頭的字串
{options}的指定:
主要用到的就是:STARTING AT {n1}指定開始位置
ENDING AT {n2}指定結束位置
常用場合:
一般用來判斷某個字串是否符合條件。也可以結合其他語句對字串進行操作。
5).CONDENSE:去掉字串中的空格
CONDENSE {c} [NO-GAPS].:
作用:去掉字串中的前面和後面的空格,如果指定NO-GAPS,則去掉字串中的所有空格。
常用場合:獲得字串的精確長度,用於判斷。
6).SPLIT:拆分字串
SPLIT {c} AT {del} INTO {c1} ... {cn}.
作用:按照分割字元del把字串c分割成c1…cn。
SPLIT {c} AT {del} INTO TABLE {itab}.
作用:按照分割字元del把c分割,然後放到內表中的相應欄位
常用場合:
檔案名稱的分割,根據完整的檔案路徑加檔案名稱把檔案名稱分割出來。
痛點:無法確定要分割多少次.
解決方案:兩兩分割,到最後的那個就是了。例如:str=c:"dir1"dir2"dir3"file
Split str at '"' into str1 str2.
Find str2 for '/'.
Check sy-subrc = 0.
Do.
Find str2 for '/'.
If sy-subrc = 0.
Split str2 into str1 str2.
Else.
Exit.
Endif.
Enddo.
檔案上傳的類型是字串,把其分割後放到內表中。例如上面的問題:
data: begin of itab occurs 0 ,
col1(30) type c,
end of itab.
Split str at '"' into table itab.
describe table itab lines line.
Read table itab index line.
Itab-col1就是file
7).CONCATENATE:連接字串
CONCATENATE {c1} ... {cn} INTO {c} [SEPARATED BY {s}].
作用:把c1…cn用s分隔串連到c中
常用場合:檔案下載,對檔案中的欄位編輯。
8).SHIFT <c> [BY <n> PLACES] [<mode>].
按照給定位置數移動字串
該語句將欄位 <c> 移動 <n> 個位置。如果省略 BY <n> PLACES, 則將<n>解釋為一個位置。如果<n> 是 0 或負值,則<c>保持不變。如果<n>超過<c>長度,則<c>用空格填充 。<n> 可為變數。
對不同(<mode>) 選項,可以按以下方式移動欄位 <c>:a.LEFT:向左移動 <n> 位置,右邊用<n>個空格填充(預設設定 )。b.RIGHT:向右移動<n>位置,左邊用<n>個空格填充 。c.CIRCULAR:向左移動 <n> 位置,以便左邊 <n> 個字元出現在右邊。
移動欄位串到給定串
SHIFT <c> UP TO <str> <mode>.
ABAP/4 尋找<c>欄位內容直到找到字串 <str> 並將欄位<c> 移動到欄位邊緣。 <mode> 選項與按給定位置數移動欄位串中所述相同。<str> 可為變數。
如果 <c> 中找不到 <str>, 則將SY-SUBRC 設定為 4 並且不移動 <c>。否則,將 SY-SUBRC 設定為0。
根據第一個或最後一個字元移動欄位串
假設第一個或最後一個字元符合一定條件,則可用 SHIFT 語句將欄位向左或向右移動。為此,請使用以下文法:
SHIFT <c> LEFT DELETING LEADING <str>.
SHIFT <c> RIGHT DELETING TRAILING <str>.
假設左邊的第一個字元或右邊的最後一個字元出現在 <str> 中,該語句將欄位 <c> 向左或向右移動。欄位右邊或左邊用空格填充。<str> 可為變數。
9).轉換為可排序格式
可以將字元欄位轉換為可按字母順序排列的格式:
文法
CONVERT TEXT <c> INTO SORTABLE CODE <sc>.
該語句為字 符欄位 <c> 填充可排序 目標欄位 <sc>。 欄位 <c> 必須是類型 C且欄位 <sc> 必須是類型 X ,最小長度 為 <c> 長度的16倍 。
該語句目的是為字元欄位<c>建立相關欄位<sc>,作為<c>的按字母順序排列的排序關鍵字。在內表的內容和已解壓縮的資料中進行排序(參見內表排序和給摘錄資料集排序)。
如果對未轉換的字元欄位進行排序,則系統建立與各字母的特定平台內部編碼相對應的順序。在對目標欄位進行排序之後,轉換CONVERT TEXT 按這樣的方式建立目標欄位,相應的字元欄位順序按字母排序。例如,在德語中,順序為‘Miller、Moller、M?ller、Muller’,而不是‘Miller、Moller、
Muller、M?ller’。
轉換方法依賴於運行ABAP/4程式的文本環境。文本環境在使用者主記錄中定義。例外的是可以使用如下語句,在程式中設定文本環境:
文法
SET LOCALE LANGUAGE <lg> [COUNTRY <cy>] [MODIFIER <m>].
該語句根據語言<lg>設定文本環境。對於選項COUNTRY,只要特定國家語言不同,就可以在語言以外指定國家。對於選項MODIFIER,只要一個國
家內語言不同,就可以指定另一個標識符,例如,排序次序在電話簿和詞典之間不同。
欄位<lg>、<cy>和<m>必須是類型C且長度必須與表TCP0C的關鍵字段長度相等。表TCP0C是一個表格,從中進行平台相關的文本環境維護。在語句SETLOCALE期間,系統根據TCP0C中的條目設定文本環境。除了內部傳送的平台特性之外,用SET語句指定表關鍵字。如果<lg>等於SPACE,則系統根據使用者主記錄設定文本環境。如果對於指定的關鍵字在表中無條目,則系統將產生運行錯誤。
文本環境影響ABAP/4中依賴於字元集的所有操作。
有關該主題的詳細資料,參見CONVERT TEXT和SET LOCALE LANGUAGE 的關鍵字文檔。
關於如何根據語言排序的樣本,參見內表排序。
10) 覆蓋字元欄位
要用另一字元欄位覆蓋字元欄位,請使用OVERLAY語句,用法如下:
文法
OVERLAY <c1> WITH <c2> [ONLY <str>].
該語句用<c2>的內容覆蓋欄位<c1>中包含<str>中字母的所有位置。<c2>保持不變。如果省略ONLY<str>,則覆蓋欄位<c1>中所有包含空格的位置。
如果至少要替換<c1>中的一個字元,則將SY-SUBRC設定為0。對於所有其它情況,將SY-SUBRC設定為4。如果<c1>比<c2>長,則只覆蓋<c2>
中的長度。
11) 獲得字串長度
要決定字串到最後一個字元而不是SPACE的長度,請使用內建函式STRLEN,用法如下:
文法
[COMPUTE] <n> = STRLEN( <c> ).
STRLEN將運算元<c>作為字元資料類型處理,而不考慮其實際類型。不進行轉換。
12) 分配字串部分
MOVE語句的以下變體只使用類型C欄位:
文法
MOVE <c1> TO <c2> PERCENTAGE <p> [RIGHT].
將靠左對齊的字元欄位<c1>的百分比<p>(或如果用RIGHT選項指定,則為靠右對齊)複製到<c2>。
<p>值可為0和100之間的任何數。將要從<f1>複製的長度取整為下一個整數。
如果語句中某一參數不是類型C,則忽略參數PERCENTAGE。
DATA C1(10) VALUE 'ABCDEFGHIJ',
C2(10).
MOVE C1 TO C2 PERCENTAGE 40.
WRITE C2.
MOVE C1 TO C2 PERCENTAGE 40 RIGHT.
WRITE / C2.
該過程的輸 出如下:
ABCD
ABCD