[英]Find the Nth instance of a character in Excel (no VBA)
TL; DR摘要:我想要一個公式,該公式將在字符串中找到第N個“ _
”(對於任何N),並返回其索引; 或找到第N個子字符串,用“ _
”分隔。 我有VBA來執行此操作,但是速度很慢。
加長版:我正在處理廣告活動數據。 我的營銷人員(很幸運)在廣告系列中使用了一致的命名方案。 不幸的是,這很長。
廣告系列名稱恰好包含我無法通過報告獲得的1條數據。
供參考,廣告系列名稱的格式為:
ADV_CO_BG_Product_UniqueID_XX_mm.dd.yyyy_mm.dd.yyyy_TYP_NUM
...而我有一列約200K(每周增長幾百)。
編輯:
重要的是,廣告系列名稱包含多個部分,其中_
作為分隔符。 在這種情況下,我需要第9部分,但我需要一個足夠靈活的選項,而不必添加或刪除行來更改我定位的部分。
我在其他問題上也看到過使用嵌套公式,例如:
=MID(
Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign])+1)
+1)
+1)
+1)
+1)
+1)
+1)
+1,
3)
...但是如果我需要其他位置的東西很難修改。
我有一個稱為StringSplit的UDF(請參見下文),它提供了所需的結果,但是它非常慢(並且只有在啟用了宏的情況下才起作用,但並非我的所有聽眾都可以這樣做)。
有沒有更好的方法來做我想做的事情?
Public Function StringSplit(input_ As String, delimiter_ As String, index_ As Integer)
On Error GoTo err
out = Split(input_, delimiter_, -1, vbTextCompare)
StringSplit = out(index_ - 1)
Exit Function
err:
If err.Number = 9 Then
StringSplit = CVErr(xlErrRef)
Exit Function
End If
StringSplit = err.Description
End Function
您是說,如果我是對的,那么您收到的數據始終采用您發布的格式,並且您始終希望提取TYP數據。
為什么不在字符串中搜索TYP
,並另外搜索NUM
因為它表示以下子數據?
然后,您將得到一個公式,例如
=TRIM(MID(W20,SEARCH("TYP",W20),SEARCH("NUM",W20)-SEARCH("TYP",W20)))
在此公式中,單元格W20
保存整個數據字符串。 當然,您可以編輯此范圍,也可以將整個字符串粘貼到其位置。
編輯
由於OP提到標題字符串不一致:
=TRIM(MID(W20,SEARCH(A1,W20),IF(A2="",LEN(W20),SEARCH(A2,W20)-SEARCH(A1,W20))))
在單元格A1
中將是必須提取的數據的標題字符串,在這種情況下為TYP
在單元格A2
中將是下一個子數據的標題字符串。 如果為空,該公式將使用單元格A1
返回從第一個SEARCH
函數找到的所有字符。
正如Egan Wolf所說, http://exceljet.net/formula/find-nth-occurrence-of-character =MID([@[Campaign]],FIND(CHAR(160),SUBSTITUTE([@[Campaign]],"_",CHAR(160),9))+1,4)
或更一般而言: =MID(TextToSearch,FIND(CHAR(160),SUBSTITUTE(TextToSearch,Delimiter,CHAR(160),InstanceNumber ))+1,LengthOfDesiredSection)
當然,可以通過第一個公式的一個子節找到LengthOfDesiredSection
,如下所示(為清楚起見添加了換行符):
=MID(TextToSearch,
FIND(CHAR(160),SUBSTITUTE(TextToSearch,Delimiter,CHAR(160),InstanceNumber))+1,
IFERROR(
(FIND(CHAR(160),SUBSTITUTE(TextToSearch,Delimiter,CHAR(160),InstanceNumber+1)-
FIND(CHAR(160),SUBSTITUTE(TextToSearch,Delimiter,CHAR(160),InstanceNumber)))-1,
LEN(TextToSearch)-
FIND(CHAR(160),SUBSTITUTE(TextToSearch,Delimiter,CHAR(160),InstanceNumber))))
IFERROR()
可防止Delimiter
在TextToSearch
僅出現InstanceNumber
次的TextToSearch
。
查找下划線定界字符串的第n個實例並返回該子字符串的一種方法是使用以下公式:
=TRIM(MID(SUBSTITUTE(A1,"_",REPT(" ",999)),MAX(1,999*(n-1)),999))
其中n
是您要查找的實例。
但是,當然,這要求元素以相同的順序出現,並且始終存在(或者如果不存在則用下划線代替)。
如果您使用的是帶有FILTERXML
函數的Excel版本,則可以使用以下公式:
=INDEX(FILTERXML("<t><s>" & SUBSTITUTE(A1,"_","</s><s>") & "</s></t>","//s"),n)
不知道在大型數據庫上哪一個效率更高(更快)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.