【问题标题】:excel formula find part number in file path text stringexcel公式在文件路径文本字符串中查找零件号
【发布时间】:2018-08-10 19:08:16
【问题描述】:

我有一个网络驱动器上所有文件的摘录,在一些文件名中是一个部件号,部件号格式是0000-000000-00。现在,在这个文件中的 600,000 多个路径名中,我试图弄清楚如何从路径名中提取我的部件号。我认为mid 公式可能有效,但我不知道如何告诉它使用部分# 格式查找任何内容0000-000000-00 并仅从路径中提取这 14 个字符?

输入看起来像这样

c:\users\stuff\folder_name\1234-000001-01_ baskets_1.pdf
c:\users\stuff\folder_name\1234-000001-02_ baskets_2.pdf
c:\users\stuff\folder_name\1234-000001-03_ baskets_3.pdf
c:\users\stuff\folder_name\1234-000030-01_ tree_30.pdf
c:\users\stuff\folder_name\random text_1234-000030-02_ tree_30.pdf
c:\users\stuff\folder_name\more random stuff_1234-000030-02_ tree_30.pdf

我希望的输出

1234-000001-01
1234-000001-02
1234-000001-03
1234-000030-01

【问题讨论】:

    标签: excel string excel-formula partial


    【解决方案1】:

    既然你有一个我们可以利用的模式,那就用这个:

    =MID(A1,SEARCH("????-??????-??",A1),14)
    

    查找模式的开头并返回后面的 14 个字符。

    【讨论】:

    • 我应该把它添加到示例中,我会在几秒钟内添加,但有时部分 # 前面还有其他文本。有没有办法在 # 部分中使用双连字符进行训练?
    • “部分#前面的其他文字”是指c:\users\stuff\folder_name\othertext1234-000001-01_ baskets_1.pdf之类的东西吗?
    • @scottcraner 这很好用,我将在文件路径混乱的数据子集上进行尝试。不过谢谢
    【解决方案2】:

    您想要一个公式,但 UDF 也可用于应用正则表达式来获取模式(在这种情况下有点矫枉过正,但值得注意):

    Option Explicit
    Public Sub GetCustomString()
        Dim i As Long, tests()
        tests = Array("c:\users\stuff\folder_name\1234-000001-01_ baskets_1.pdf", _
        "c:\users\stuff\folder_name\1234-000001-02_ baskets_2.pdf", _
        "c:\users\stuff\folder_name\1234-000001-03_ baskets_3.pdf", _
        "c:\users\stuff\folder_name\1234-000030-01_ tree_30.pdf", _
        "c:\users\stuff\folder_name\random text_1234-000030-02_ tree_30.pdf", _
        "c:\users\stuff\folder_name\more random stuff_1234-000030-02_ tree_30.pdf")
    
        For i = LBound(tests) To UBound(tests)
            Debug.Print GetString(tests(i))
        Next
    End Sub
    
    Public Function GetString(ByVal inputString As String) As String
        Dim arr() As String, i As Long, matches As Object, re As Object
        Set re = CreateObject("VBScript.RegExp")
        With re
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\d{4}-\d{6}-\d{2}"
            If .test(inputString) Then
                GetString = .Execute(inputString)(0)
            Else
                GetString = vbNullString
            End If
        End With
    End Function
    

    在工作表中使用 UDF:


    模式:\d{4}-\d{6}-\d{2}

    解释:

    \d{4} 匹配一个数字(等于 [0-9])

    {4} 量词 - 精确匹配 4 次

    “-”匹配字符 - 字面意思(区分大小写)

    \d{6} 匹配一个数字(等于 [0-9])

    {6} 量词 - 精确匹配 6 次

    “-”匹配字符 - 字面意思(区分大小写)

    \d{2} 匹配一个数字(等于 [0-9])

    {2} 量词 - 精确匹配 2 次​​p>

    全局模式标志: g 修饰符:全局。所有比赛(第一场比赛后不返回) m 修饰符:多行。使 ^ 和 $ 匹配每行的开始/结束(不仅是字符串的开始/结束)

    【讨论】:

    • Dude 绝对是一个很好的解决方案,感谢您的指导。我想我会遵循它,我会在我更大的数据集上进行尝试。我知道我将来会做类似的事情,所以 usf 可能是正确的选择
    猜你喜欢
    • 1970-01-01
    • 2015-03-03
    • 2015-07-14
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多