今天來看一組名字長得像 LEN、LEFT、FIND,但結尾多了一個 B 的函式:LENB、LEFTB、RIGHTB、MIDB、FINDB、SEARCHB、REPLACEB。
B 是 byte(位元組)的意思。以這篇的例子來說,LEN 把一個中文字或英文字母算成 1;LENB 把「蘋果紅茶」每字算成 2,半形英數字和空格算成 1。這是 Sheets 這組函式的計數方式,不是檔案的 UTF-8 編碼長度。
坦白說,我個人在工作上幾乎不用這一組。會想到它們的情況很固定:系統欄位使用與這組函式相同的位元組計數規則,或是想檢查字元在這組函式裡算 1 還是 2。這篇當作工具書,需要時回來查。
最容易誤會的是:有些參數按字元,有些按位元組,不能只看函式名稱有 B 就把位置全部當成位元組。
怎麼選
先看各參數的單位。尤其 MIDB、REPLACEB 的起點按字元,長度才按位元組:
| 函式 | 單位 | 對應的字元版 | 用途 |
|---|---|---|---|
LENB | 位元組 | LEN | 算長度 |
LEFTB、RIGHTB | 長度:位元組 | LEFT、RIGHT | 從兩端擷取文字 |
MIDB | 起點:字元;長度:位元組 | MID | 從指定字元開始擷取 |
FINDB、SEARCHB | 回傳:位元組位置 | FIND、SEARCH | 找出文字位置;起搜參數見下方說明 |
REPLACEB | 起點:字元;長度:位元組 | REPLACE | 從指定字元開始取代 |
字元版的用法請看 文字函式基礎,這篇不重講。
下面的例子都用同一批品名,先看長度對照:
| 品名 | 字元數(LEN) | 位元組(LENB) |
|---|---|---|
| 蘋果紅茶 | 4 | 8 |
| Apple 紅茶 | 8 | 10 |
| Tea | 3 | 3 |
「Apple 紅茶」的算法是 Apple 5 個、空格 1 個,共 6 個位元組,加上「紅茶」2 個字乘 2,一共 10。
算長度
LENB
回傳文字的位元組數。
語法:
蘋果紅茶有幾個位元組
=LENB("蘋果紅茶")這四個中文字各算 2,4 × 2 = 8,結果是 8。同一個字串的 LEN 是 4。
在本文中文與英文混排的範例中,LENB 減 LEN 可算出被計為 2 的字元有幾個;這不等同通用的全形字判定。
Apple 紅茶裡有幾個計為 2 的字元
=LENB("Apple 紅茶") - LEN("Apple 紅茶")10 − 8 = 2,得到 2,對應這裡的「紅茶」。不要把這個差值直接當作全形字數:半形片假名 ア 的 LENB 也是 2。
擷取
LEFTB
從左邊取指定位元組數的文字。
語法:
從蘋果紅茶左邊取 4 個位元組
=LEFTB("蘋果紅茶", 4)4 個位元組剛好是這裡的 2 個中文字,得到「蘋果」。
位元組數切在中文字中間時,不要假設會截成半個字。 仍得到「蘋果」, 則得到「紅茶」;結果的位元組數可能超過指定值。若需求是取幾個完整字,直接用 LEFT、RIGHT 比較清楚。
RIGHTB
從右邊取指定位元組數的文字。
語法:
從蘋果紅茶右邊取 4 個位元組
=RIGHTB("蘋果紅茶", 4)結果是「紅茶」。
MIDB
從指定的字元位置開始,依指定位元組數擷取文字。
語法:
- 開始位置:從 1 開始,單位是字元。
- 位元組數:擷取的長度,單位是位元組。
MIDB 跟 MID 一樣需要三個參數,寫法照 MID。
從第 3 個字元開始取 4 個位元組
=MIDB("蘋果紅茶", 3, 4)第 3 個字元是「紅」,從這裡取 4 個位元組,得到「紅茶」,與 MIDB 官方定義 的字元起點一致。若改成 ,才會得到「果紅」。 也會得到完整的「紅茶」,不要把位元組長度當成一定不會超過的截斷上限。
搜尋
FINDB
找出一段文字從第幾個位元組開始,區分大小寫。
語法:
- 開始位置:選填,指定從第幾個字元開始找;回傳值仍是整串文字中的位元組位置。
例如 得到 3;起點改為 3 就會跳過「果」而找不到。
紅在蘋果紅茶的第幾個位元組
=FINDB("紅", "蘋果紅茶")「蘋」佔 1 到 2、「果」佔 3 到 4,「紅」從第 5 個位元組開始,得到 5。換成 FIND 的話,答案是第 3 個字。
找不到的時候跟 FIND 一樣是 #VALUE!。
SEARCHB
跟 FINDB 一樣回傳位元組位置,差別是不分大小寫,而且可以用萬用字元(? 和 *)。
語法:
茶在 Apple 紅茶的第幾個位元組
=SEARCHB("茶", "Apple 紅茶")Apple 加空格佔 6 個位元組,「紅」是 7 到 8,「茶」從第 9 個位元組開始,得到 9。同一個字串用 SEARCH 會是 8,因為它數的是第 8 個字。
取代
REPLACEB
從指定的字元位置開始,依位元組長度選取一段文字,再換成新文字。
語法:
把紅茶換成綠茶
=REPLACEB("蘋果紅茶", 3, 4, "綠茶")「紅」是第 3 個字元,接下來的「紅茶」共 4 個位元組,所以得到「蘋果綠茶」。如果把起點寫成 5,會從原字串末尾之後開始,結果變成「蘋果紅茶綠茶」。
什麼時候真的需要它們
要把搜尋結果交給 MIDB 或 REPLACEB 當起點時,用 FIND 算字元位置。例如 FIND("紅", "蘋果紅茶") 得到 3,可以作為起點;FINDB 得到的 5 是位元組位置,直接套入就會切錯。
我的做法是:沒有位元組計數需求的話,使用字元版。需要 B 版本時,逐一確認起點、長度、回傳值的單位;若要符合外部系統的檔案長度限制,還要先核對它使用的編碼與計數規則。
好,工具書就到這邊,下次需要再回來查囉!
接下來可以
相關文章
查看所有文章TEXT 函式入門:用格式碼把數字和日期變成指定樣子的文字
TEXT 的語法與常用格式碼:0、#、千分位、百分比、yyyy/mm/dd、星期、hh:mm,並說明 TEXT 的結果是文字,不能再拿去加總。
文字清理函式參考:TRIM、CLEAN、SUBSTITUTE、PROPER 與看不見的空格
整理 TRIM、CLEAN、SUBSTITUTE、REPLACE、UPPER、LOWER、PROPER 的語法與限制,包含 TRIM 清不掉全形空格與 CHAR(160)、CLEAN 只清 ASCII 0 到 31、SUBSTITUTE 第 4 參數只換第 N 次,以及用 UNICODE 找出看不見的字元。
拆字串與合字串:SPLIT、TEXTJOIN、JOIN、CONCATENATE 與 CONCAT
整理一格拆多格的 SPLIT(split_by_each、remove_empty_text、數字和日期自動轉換)與多格合一格的 TEXTJOIN、JOIN、CONCATENATE、CONCAT,包含 ignore_empty、JOIN 只吃一維、CONCAT 只有兩個參數,以及和 & 運算子的差別。
留言討論
共 0 則留言
