時間:2023-06-19|瀏覽:360
提取第一個漢字前面的編碼。
由于編碼與描述混合在一起,中間還有數(shù)量與規(guī)格的數(shù)字,所以直接用Text.Select是不行的。用數(shù)字到非數(shù)字的分列也不行,因為編碼中還有非數(shù)字字符“-”。我們需要自定義一個函數(shù)來確定第一個漢字的位置。因此,我們需要了解一個關于字符編碼的常識:漢字的Unicode編碼范圍是4E00-9FA5。也就是說,只要字符的編碼大于或等于4E00就可以認為是漢字。我們就根據(jù)這個來判斷第一個漢字的位置。
自定義函數(shù)法:
我們模擬一個字符串,提取第一個漢字的位置。
=List.Min(List.Transform(Text.ToList("123456產(chǎn)品12"), each if Character.ToNumber(_) >= 0x4e00 then Text.PositionOf("123456產(chǎn)品12", _) else 999 ))
然后用這個創(chuàng)建函數(shù):
=(t)=> List.Min(List.Transform(Text.ToList(t), each if Character.ToNumber(_) >= 0x4e00 then Text.PositionOf(t, _) else 999 ))
就是把字符串用參數(shù)t替換。
解釋一下,上面這一句的意思,就是把字符串轉(zhuǎn)換成單個字符的列表,然后用Character.ToNumber函數(shù)把每個字符轉(zhuǎn)成數(shù)值編碼,與0x4E00進行比較,如果符合條件就得出這個字符在整個字符串中的位置,如果不符合條件就給出一個很大的值。因為我們最后要取得漢字的最小位置,所以要取這些位置中的最小值。
有了這個函數(shù),我們就可以很方便地得出每個字符串第一個漢字的位置,然后根據(jù)這個位置使用函數(shù)Text.Range來拆分字符串。
Text.Range([線上商家編碼], 0, fx([線上商家編碼]))
從位置0開始,截取長度為第一個漢字的位置,這樣就能得到我們想要的第一個漢字之前的編碼了。
文本拆分法:
再來一種方法,使用Text.SplitAny函數(shù)。同樣的我們要知道漢字的范圍,4E00對應的是“一”,基本漢字的最后一個9FA5對應的是“龥”。這就是我們常??吹降挠行┕街谐霈F(xiàn)的:{"一".."龥"}。這就是基本漢字的范圍。我們把所有的漢字合并起來得到的是一個列表。我們需要的是第一個值,所以用{0}來提取列表的第一個值。
應用到我們的數(shù)據(jù)中就是這樣的。
CTRL+E法:
在Excel中還有個簡單的方法CTRL+E智能填充。當然第一次不能成功,還要修改一下示例數(shù)據(jù),加上4-4的那一行,然后再繼續(xù)CTRL+E。
PowerQuery中的兩種方法,都需要了解漢字的Unicode編碼,如果經(jīng)常處理這種混合字符串,就需要記住漢字的范圍:{"一".."龥"},或者數(shù)值范圍十六進制:4E00-9FA5。