首頁>技術>

問題:提取第一個漢字前面的編碼

因為編碼與描述混合在一起,中間還有數量與規格的數字,所以直接用Text.Select是不行的,用數字到非數字的分列也不行,因為編碼中還有非數字字元“-”。

我們需要自定義一個函式來確定第一個漢字的位置,那麼我們就需要了解一個關於字元編碼的常識:

漢字的Unicode編碼範圍是4E00-9FA5,也就是說只要字元的編碼大於或等於4E00就可以認為是漢字,我們就根據這個來判斷第一個漢字的位置。

自定義函式法

我們模擬一個字串,提取第一個漢字的位置

= List.Min(List.Transform(Text.ToList("123456產品12"),each if Character.ToNumber(_)>=0x4e00 then Text.PositionOf("123456產品12",_) else 999))

然後用這個建立函式:

= (t) => List.Min(List.Transform(Text.ToList(t),each if Character.ToNumber(_)>=0x4e00 then Text.PositionOf(t,_) else 999))

就是把字串用引數t替換。

解釋一下,上面這一句的意思,就是把字串轉換成單個字元的列表,然後用Character.ToNumber函式把每個字元轉成數值編碼,與0x4E00進行比較,如果符合條件就得出這個字元在整個字串中的位置,如果不符合條件就給出一個很大的值,因為我們最後要取得漢字的最小位置。

有了這個函式,我們就可以很方便地得出每個字串第一個漢字的位置,然後根據這個位子使用函式Text.Range來拆分字串:

Text.Range([線上商家編碼],0,fx([線上商家編碼]))

從位置0開始,擷取長度為第一個漢字的位置,這樣就能得到我們想要的第一個漢字之前的編碼了。

文字拆分法

再來一種方法,使用Text.SplitAny函式,同樣的我們要知道漢字的範圍,4e00對應的是”一“

基本漢字的最後一個9fa5對應的是”龥“

這就是我們常常看到的有些公式中出現的:

{"一".."龥"}

這就是基本漢字的範圍。

我們把所有的漢字合併起來作為分隔符

Text.Combine({"一".."龥"})

我們使用Text.SplitAny函式拆分之後,是一個列表,我們需要的是第一個值就用{0}來提取列表的第一個值:

應用到我們的資料中就是這樣的:

CTRL+E法

在Excel中還有個簡單的方法CTRL+E智慧填充:

當然第一次不能成功,還要修改一下示例資料,加上4-4的那一行,然後再繼續CTRL+E

Power Query中的兩種方法,都需要了解漢字的Unicode編碼,如果經常處理這種混合字串,就需要記住漢字的範圍

{"一".."龥"}

或者數值範圍十六進位制:4E00-9FA5

18
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 三種騷操作,教你繞過迭代器遍歷時的資料修改異常