簡體   English   中英

在Excel中查找字符的第N個實例(無VBA)

[英]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

我認為這是您要尋找的公式-

=MID(A2, FIND(CHAR(1), SUBSTITUTE(A2, B2, CHAR(1), C2))+1, FIND(CHAR(1), SUBSTITUTE(A2, B2, CHAR(1), C2+1)) -  FIND(CHAR(1), SUBSTITUTE(A2, B2, CHAR(1), C2))-1)

這是怎么做的-

在此處輸入圖片說明

這里B2Delimiter typeC2Delimiter typeNth occurrence of the Delimiter 您可以根據需要修改代碼。 只需更改B2C2

例如,如果您要查找第三個實例 在單元格A1中 ,嘗試:

=FIND(CHAR(1),SUBSTITUTE(A1,"?",CHAR(1),3))

在此處輸入圖片說明

注意:

我們假設CHAR(1)沒有出現在原始字符串中。
要獲取最后一個實例,請使用:

=FIND(CHAR(1),SUBSTITUTE(A1,"?",CHAR(1),(LEN(A1)-LEN(SUBSTITUTE(A1,"?","")))))

您是說,如果我是對的,那么您收到的數據始終采用您發布的格式,並且您始終希望提取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()可防止DelimiterTextToSearch僅出現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM