English 中文(简体)
MS EXCEL-搜索并提取字符串中关键字最后一个实例之前的所有文本
原标题:MS EXCEL - Search and Extract all text before last instance of a Keyword in String

使用MS Excel公式-我需要一个公式,该公式将提取字符串中特定关键字(不区分大小写和部分通配符匹配)的最后一个(第N个)实例之前的所有单词Left。

SAMPLE TEXT STRING [Cell A2] 约翰尼正在寻找一份全职工作,因为他曾经失业过的工作,尽管他现在是全职工作,但他并不高兴,他正在积极寻求一份更长期的全职工作 job that offers benefits and 1st Shift.

  1. Keyword Search [Cell B2]: Full*time
  2. No. of Keywords found within text using "Full*time" = 3
  3. Extract all Text Left/Before last instance/occurrence of Keyword - Results [Cell C2]:

约翰尼正在寻找一份全职工作,因为他曾经失业过的工作,尽管他现在是全职工作,但他并不高兴,他正在积极寻求一份更长期的全职工作

注意:以下SUBSITUE公式有效,但不允许使用SEARCH公式来搜索和匹配不区分大小写且包含通配符的关键字。

=LEFT(A2,FIND("|",SUBSTITUTE(A2,B2,"^",LEN(A2)-LEN(SUBSTITUTE(A2,B2,""))))-1)

这个公式非常有效,但我只能使用它来提取通配符关键字的最后一个实例RIGHT/AFTER,如果可能的话,我希望类似的内容。

=RIGHT(A2,LEN(A2)-1-MAX(IFERROR(SEARCH(B2,A2,ROW($1:$999)),0))+1)
问题回答

如果通配符旨在考虑不同的串联选项,则TEXTAFTER是一个很好的候选函数,可以在给定子字符串出现第n次后提取文本。问题是TEXTAFTER/TEXTBEFORE函数不接受通配符值。为了做到这一点,您需要解析所有具有特定值的串联选项。

如果要查找的带有通配符的文本位于文本A2内的单元格B2上。在C2中放入以下公式,以提取查找值的最后一个实例之前的文本:

=LET(lk,TEXTSPLIT(B2,"*"), del,TAKE(lk,,1)&{"-";" "}&TAKE(lk,,-1), 
  after, TEXTAFTER(A2, del,-1,1), SUBSTITUTE(A2, after, ""))

注意事项

  1. If you want to extract just up to the n-th occurrence of the lookup value, then replace -1 in TEXTAFTER with the number of occurrence (n) you want to consider.
  2. The solution assumes there is always a wildcard (*) in the text to find. The solution can be extended to a more general case, when the exact text is provided (no *). For example checking the number of columns of lk. The case of no wildcards returns just a single column.

它所做的是通过TEXTSPLIT用通配符拆分查找值,然后通过串联构建TEXTAFTER中使用的所有可能的分隔符,考虑每两个单词的分隔符列表:{“-”;“}。对于本例,del的值为:

Full-time
Full time

现在,我们使用TEXTAFTER来查找任何分隔符(del)的最后一个出现(1,最后一个输入参数),并进行不区分大小写的搜索。一旦我们在最后一个分隔符之后有了文本(之后的),我们就使用SUBSTITUTION来获取之前的文本。

Find last occurrence of a given substring

这是另一种方法。您可以在名称管理器中创建以下递归函数SEARCLAST

=LAMBDA(lk,txt,[init],[last], LET(
    i, IF(ISOMITTED(init), 1, init),
    prev, IF(ISOMITTED(last), 0, last),
    current, SEARCH(lk, txt, i),
    IF(ISERR(current), prev, SEARCHLAST(lk, txt, current+1,current))
))

现在按如下方式使用它:

=LET(txt,A2, lk,B2, last,SEARCHLAST(lk,txt), snd,TAKE(TEXTSPLIT(lk, "*"),,-1),
 endTkn, SEARCH(snd, txt,last+1)+LEN(snd)-1,
 LEFT(txt, endTkn))

这种方法的问题在于,您需要避免误报,这是因为SEARCH/FIND函数是如何工作的。如果您在输入文本中有全职而不是全日制,它也会找到这个词,因此您需要以防止它出现的方式构建查找值,例如在末尾添加一个空格,在开头添加一个可选空格。

它所做的基本上是递归调用SEARCLAST,直到找不到值,然后取上一次迭代的值(prev)。它使用ISOMITTED函数来考虑一些输入参数(用括号[]分隔)作为可选参数,以具有更友好的用户界面。





相关问题
import of excel in SQL imports NULL lines

I have a stored procedure that imports differently formatted workbooks into a database table, does work on them then drops the table. Here is the populating query. SELECT IDENTITY(INT,1,1) AS ID ...

Connecting to Oracle 10g with ODBC from Excel VBA

The following code works. the connection opens fine but recordset.recordCount always returns -1 when there is data in the table. ANd If I try to call any methods/properties on recordset it crashes ...

Excel date to Unix timestamp

Does anyone know how to convert an Excel date to a correct Unix timestamp?

C# GemBox Excel Import Error

I am trying to import an excel file into a data table using GemBox and I keep getting this error: Invalid data value when extracting to DataTable at SourceRowIndex: 1, and SourceColumnIndex: 1. As ...

Importing from excel "applications" using SSIS

I am looking for any tips or resources on importing from excel into a SQL database, but specifically when the information is NOT in column and row format. I am currently doing some pre-development ...