一整段文字放在同一格時,想知道每個字元各出現幾次,可以先把它逐個拆成一欄,再列出不重複的項目並計數。這能用來檢查重複符號、簡單文案與輸入內容的組成。
本篇使用自製短文字,英文字母先統一為大寫,空白與換行保留計數。結果是字元頻率,不是中文斷詞、關鍵字分析,也不是人眼看到的完整 emoji 個數。
準備文字與輸出空間
在空白工作表的 B2 輸入下面這段文字;A 後面有一個半形空白,後面的 a 是小寫:
茶茶A a*?~*在 D1:E1 填入「字元、次數」,清空 D2:E30。英文字母合併後,預期出現順序如下:
| 字元 | 次數 |
|---|---|
| 茶 | 2 |
| A | 2 |
| [空白] | 1 |
| * | 2 |
| ? | 1 |
| ~ | 1 |
順序依首次出現排列,不是依次數排序。合計次數為 9,與這份經大寫轉換的簡單文字長度相同。
一次拆分、去重與計數
在 D2 輸入:
統一英文字母大小寫,並把空白與換行顯示成可辨識標籤
=IF(
B2="",
"沒有文字",
LET(
t, UPPER(B2),
chars, ARRAYFORMULA(MID(t, SEQUENCE(LEN(t)), 1)),
u, UNIQUE(chars),
HSTACK(
MAP(u, LAMBDA(x,
SWITCH(x, " ", "[空白]", CHAR(10), "[換行]", x)
)),
MAP(u, LAMBDA(x, SUMPRODUCT(N(chars=x))))
)
)
)這份公式分成四個階段:
UPPER先統一大小寫,讓a與A都計入A。SEQUENCE(LEN(t))產生從 1 到文字長度的直向序號;ARRAYFORMULA讓MID一次取出各位置,形成一欄chars。UNIQUE留下不同的字元;MAP逐個取出x,用等號比較整欄,再以SUMPRODUCT將符合項目加總。HSTACK把顯示標籤與次數並排。只有輸出標籤轉成[空白]、[換行],計數時仍比較真正的原始字元。
空白輸入會顯示「沒有文字」,先避開長度為 0 的序號問題。若是數字代碼,請先把來源儲存格設為純文字,尤其是需要保留前置零的內容。
為什麼不直接用 COUNTIF?
COUNTIF 的條件支援萬用字元:* 可代表任意文字,? 可代表單一字元,~ 用於跳脫。把「每個字元」直接當條件,會讓星號、問號等符號產生另一種意思。COUNTIF 官方說明
本篇用 chars=x 做字面相等比較,所以原文裡兩個星號就得到 2,問號和波浪號各得到 1。這個寫法也先明確決定大小寫合併規則,不把它當成區分大小寫的統計器。
保留空白和換行,有什麼用?
把 B2 改成第一行「茶 」與第二行「茶」,第一行的茶後面保留一個半形空白。你也可以在 B2 暫時輸入:
建立含一個半形空白及一個換行的測試文字
="茶 " & CHAR(10) & "茶"預期是茶 2 次、[空白] 1 次、[換行] 1 次。這適合檢查肉眼容易漏看的字元。全形空白、Tab、不換行空白是不同字元,本文沒有替它們製作專屬標籤,也沒有移除或合併它們。
Google 官方說明,LEN 也計算空白及不可見字元。LEN 官方說明
UTF-16 限制:不要把結果叫做 emoji 字數
在 Google 試算表裡,LEN("🦊") 回傳 2;使用拉丁字母 e 加上獨立組合重音符號的 LEN("é") 也回傳 2。這裡依照試算表文字函式的 UTF-16 單位拆分,沒有處理使用者感知的完整字素(grapheme cluster)。
因此,代理字元對、組合重音、膚色修飾、國旗與連接的 emoji,都不能保證一個畫面符號就是一列。這個案例適合一般中文字、英文字母與簡單符號;要分析這些複合文字,應先選用能辨識字素的文字處理方式。本文不把兩個測例推論成所有 Unicode 情況都已驗收。
此外,UPPER 是一個明確的資料轉換:你得到的是轉大寫後文字的頻率。需要保留原始大小寫或處理其他語系特殊大小寫規則時,必須重新設計去重與比較方式,不能只刪除 UPPER 就宣稱完成。
自己練習與排錯
- 把
B2改成*?~*,確認星號 2、問號 1、波浪號 1。 - 改成
aAa,確認只顯示A,次數為 3。 - 清空
B2,確認顯示「沒有文字」,最後還原茶茶A a*?~*。
出現 #REF! 時,清空結果下方與右側的儲存格。文字很長時,每個不同字元都會掃描整欄拆分結果,計算量會增加;本篇沒有測得大型語料的效能上限,不建議直接拿整本書當第一個練習。
本文改寫自方格子的字頻統計案例,換成自製文字並補上符號與文字單位限制。想拆解每一步,可搭配 MID 與 LEN、SEQUENCE 數列、LAMBDA 實戰。
接下來可以
相關文章
查看所有文章LEFT、MID、RIGHT、LEN、FIND、SEARCH 用法:從文字裡切出你要的那一段
LEFT、MID、RIGHT 依位置截取文字,LEN 算長度,FIND 與 SEARCH 找出符號的位置。附語法、FIND 與 SEARCH 的差別、找不到時的錯誤,以及把它們組起來拆商品編號的做法。
亂數與序列函式:RAND、RANDBETWEEN、RANDARRAY、SEQUENCE
RAND、RANDBETWEEN、RANDARRAY 產生亂數,SEQUENCE 產生等差數列。附語法、抽籤與洗牌的例子,以及亂數每次重算都會變、要用貼上值固定的做法。
拿掉輔助欄:用 MAP、SCAN、BYROW 重寫一張訂單表
一張手搖飲訂單表原本有小計、折扣、折扣後金額三個輔助欄,改用 MAP 搭配 LET 一條公式算完,再用 SCAN 做累計、用 BYROW 找每列最大值、用 SCAN 與 REDUCE 模擬補貨庫存。附何時還是留輔助欄的取捨。
留言討論
共 0 則留言
