快速搞定字符串提取1-兩側提取英文、數字
上篇最後留下的一個問題你做出來了嗎?
我相信大部分小夥伴都做出來了,其實只需要LEFT和RIGHT換一下就能搞定的,我就不做演示了。
今天這篇涉及的知識量有點大,請小夥伴們多點耐心看下去,一個案例引發多個知識點,先來看一下今天的需求:
A列是包含「品名」「貨號」及「商品屬性」的信息源,規則是:
第一個英文之前的字符串是品名
第一個英文到最後一個數字為貨號
最後一個數字之後為商品的屬性
先來看結果,結果之後是講解:
C2單元格輸入:
=MIDB(A2,1,SEARCHB("?",A2)-1)
註:其中的問號是半角符號,很重要
下拉填充
D2單元格輸入:
=MID(A2,LEN(C2)+1,LOOKUP(1,0/MID(A2,ROW($1:$99),1),ROW($1:$99))-LEN(C2))
下拉填充
E2單元格輸入:
=SUBSTITUTE(A2,C2&D2,""),下拉填充
先來了解幾個函數:
LOOKUP(查找的值,查找的範圍,返回值的範圍)
MIDB/MID(字符串,截取開始位數,需截取位數)
其中MIDB,全形字符為2個字節,半角字符為1個字節,漢字為全形字符。mid則一概計數為1.
SUBSTITUTE(要替換的文本,舊文本,新文本,[替換第幾個])
SEARCHB(要查找的文本,要在其中查找文本的文本,要開始查找的位置)
其中,全形字符佔2個字節,半角字符佔1個字節。
先來看C列獲取品名的公式,以C2為例:
SEARCHB("?",A2),這一步半角的問號,起到通配符的作用代表查找第一個1個字節的字符所在位置,本例中半角問號代表的就是貨號的"n"所在的位置,上篇講到過漢字及全形符號是佔2個字節,又因SEARCHB是按字節計數,所以一個漢字計數為2,4個漢字計數為8,那麼"n"在第九個,所以結果返回9再減去1得到"n"前一位的位數。
把以上結果帶入公式就等於MIDB("農夫山泉n123456大瓶",1,9-1),這樣就很好理解了,midb函數中一個漢字佔2位,四個漢字就佔8位,結果返回"農夫山泉"。
當然這個公式也可以換成MID的寫法:
=MID(A2,1,(SEARCHB("?",A2)-1)/2)
因為mid函數一概計數為1,所以我們把SEARCHB的結果除以2,轉換成以1計數的形式供mid取值。
再來看D列獲取貨號的公式,以D2為例:
LOOKUP(1,0/MID(A2,ROW($1:$99),1),ROW($1:$99))
這個是lookup一個很經典的用法:查找最後一個數字所在的位數
首先MID(A2,ROW($1:$99),1)會將A2單元格拆分成包含99個元素的數組,無內容記為空(當然如果你知道你的數據源絕對不會超過多少位的時候你可以99換成那個「多少」,為了保險起見一般都會寫的大一點)返回結果如下:
然後用0挨個除以數組中的每個元素,如果0除以漢字或者英文肯定返回錯誤值,而如果0除以數字則返回0,結果如下:
用LOOKUP查找1在這個數組中的位置,但始終查不到,於是返回最後一個0值的位置,從而得出最後一個數字的位置,即返回11
帶入公式就好理解了
C2是品名,有4位,所以公式中的len(c2)全部換成4
=MID("農夫山泉n123456大瓶",4+1,11-4)
也就是提取"農夫山泉n123456大瓶"這個字符串第5位開始共7位的字符串,即返回值為"n123456"
最後來看E列獲取商品屬性的公式,以D2為例:
"&"是一個連接符,可以將兩個字符串連接成一個,比如1&2,結果為12
C2&D2,就等於把C2和D2兩個單元格的字符串連接起來,返回值便是"農夫山泉n123456"
SUBSTITUTE(A2,C2&D2,"")等同於SUBSTITUTE("農夫山泉n123456大瓶","農夫山泉n123456","")
意思就是將"農夫山泉n123456大瓶"中的"農夫山泉n123456"替換為空,返回值便是"大瓶"(兩個連續半角雙引號是空的意思)
今天這篇文章相對來說有點繞,可能基礎比較差的小夥伴看的雲裡霧裡的,沒關係,只要你的原數據是漢字+英文+數字+漢字的格式,這幾個公式儘管拿去用都可以實現結果的。
希望我的分享能給你節省出喝杯咖啡的時間,也感謝你的關注和支持!
本次的分享就到這裡!