簡體   English   中英

從 Excel 單元格中的不規則文本中提取子字符串

[英]Extract substrings from irregular text in Excel cell

我正在嘗試解決這個問題 -

如果假設我在 Excel 的單列中有這樣的文本

@22-atr$$1 AM**01-May-2015&&
$21-atr@10-Jan-2007*6 PM&
&&56-atr@11 PM$$8-Jan-2016*
**4 PM#68-atr@21-Mar-2022&&

我想編寫具有單獨列的函數,如下所示在此處輸入圖像描述

有人可以幫我嗎?

我正在嘗試解決這個問題,我唯一能做到的是使用=MID(A1,FIND("-",A1)+1,3)提取月份

公式的一種選擇是使用新函數,目前在 BETA 頻道中可供內部人員使用:

在此處輸入圖像描述

B1中的公式:

=LET(A,TEXTSPLIT(A1,{"@","$","&","*","#"},,1),B,SORTBY(A,IFERROR(MATCH(RIGHT(A),{"r","M"},0),3)),C,HSTACK(TAKE(B,,2),TEXTSPLIT(TEXT(--INDEX(B,3),"YYYY-Mmm-D"),"-")),IFERROR(--C,C))

這個想法是:

  • 始終使用LET()來存儲變量;
  • TEXTSPLIT()列 A 中的值使用所有可用的分隔符到列中並跳過結果數組中的空值;
  • 然后SORTBY()使用MATCH()生成的三個元素的最右邊的字符。 IFERROR()將捕獲數據字符串;
  • 在我們首先格式化為YYYY-MMM-D之后,我們可以使用HSTACK()將第一列和第二列拆分為第三個元素的結果;
  • 最后,得到的數組可以乘以雙一元。 如果不是,我們將其替換為前一個變量中的原始內容。

備注

  • 我將列 C 格式化為以 AM/PM 保存時間值。
  • 我將文本更改為保留荷蘭月份名稱,以使 Excel 識別日期以進行演示。 應該與英文名稱相同。

為了好玩,使用正則表達式的 UDF:

Public Function GetPart(inp As String, prt As Long) As Variant
    
    Dim Pat As String
    
    Select Case prt
        Case 0
            Pat = "(\d+-atr)"
        Case 1
            Pat = "(\d+\s*[AP]M)"
        Case 2
            Pat = "-(\d{4})"
        Case 3
            Pat = "-(\w+)-"
        Case 4
            Pat = "(\d+)-\w+-"
        Case Else
            Pat = ""
    End Select
        
    With CreateObject("vbscript.regexp")
        .Pattern = ".*" & Pat & ".*"
        GetPart = .Replace(inp, "$1")
    End With
        
End Function

通過=GetPart(0,A1)調用。 選項是 0-4,並按列標題的順序排列。

您可以通過應用一些簡單的轉換來實現您的願望。

  1. 將@、$、* 和 & 替換為保證不會出現在數據部分中的通用字符(例如 #)
  2. 用單個 # 替換所有出現 2 次或更多次的 # 字符
  3. 從字符串的開頭和結尾修剪 #
  4. 使用#作為分割字符將字符串分割成一個數組(vba.split)
  5. 使用 For Each 循環遍歷數組
  6. 在循環中有一組三個測試測試 1 測試字符串是否出現“-atr”測試 2 測試字符串是否出現“-XXX-”,其中 XXX 是三個字母的月份 - 然后您將日期拆分為- 給出一個帶有日/月/年的數組 測試 3 測試字符串是否有 'AM' 或 'PM'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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