如何根据特定条件从单元格中的文本中提取一行

时间:2019-08-04 11:04:17

标签: excel

我需要从包含基于特定条件的文本行的excel单元格中获取一个日期,时间戳字段

包含多行文本数据的示例excel单元格如下所示: ------------从下面的EXCEL CELL开始示例文本-------------------------- ------------------------------- -

2019-07-01 11:42:20-Adeba Shariff(工作说明)

我们检查并发现5条消息(2条肥皂和3条有效消息),并由于以下错误而在中间件(ISR.CXT.ESB.ERROR.DETAILS.LOCAL)上失败:

错误文本:

  

[IBM] [ODBC 20101驱动程序] [Microsoft SQL Server]违反了PRIMARY KEY约束“ Replenishment_PK”。无法在对象“ dbo.Replenishment”中插入重复键。重复的键值为(MNPOKNI1N810210-E86-M,598,2019年7月1日10:02 AM)。

重新处理之前:-

dis qs(ISR.CXT.ESB.ERROR.DETAILS.LOCAL) 
28 : dis qs(ISR.CXT.ESB.ERROR.DETAILS.LOCAL) 
AMQ8450I: Display queue status details. 
QUEUE(ISR.CXT.ESB.ERROR.DETAILS.LOCAL) 
TYPE(QUEUE) CURDEPTH(5) 
IPPROCS(0) LGETDATE(2019-06-30) 
LGETTIME(11.18.14) LPUTDATE(2019-07-01) 
LPUTTIME(10.02.58) MEDIALOG( ) 
MONQ(LOW) MSGAGE(25991) 
OPPROCS(0) QTIME(999999999, 999999999) 
UNCOM(NO) 

解决方案:我们忽略了带有备份的这些失败消息,因为这是违反PRIMARY KEY问题的。请让我们知道是否需要从头开始采取任何行动。

重新处理后:

dis qs(ISR.CXT.ESB.ERROR.DETAILS.LOCAL)
    29 : dis qs(ISR.CXT.ESB.ERROR.DETAILS.LOCAL)
AMQ8450I: Display queue status details.
   QUEUE(ISR.CXT.ESB.ERROR.DETAILS.LOCAL)
   TYPE(QUEUE)                             CURDEPTH(0)
   IPPROCS(0)                              LGETDATE(2019-07-01)
   LGETTIME(11.36.08)                      LPUTDATE(2019-07-01)
   LPUTTIME(10.02.58)                      MEDIALOG( )
   MONQ(LOW)                               MSGAGE(0)
   OPPROCS(0)                              QTIME(999999999, 999999999)
   UNCOM(NO)

最好的问候

2019-07-01 11:15:31-Adeba Shariff(工作说明) 重新处理之前:-

dis qs(ISR.CXT.ESB.ERROR.DETAILS.LOCAL)
    28 : dis qs(ISR.CXT.ESB.ERROR.DETAILS.LOCAL)
AMQ8450I: Display queue status details.
   QUEUE(ISR.CXT.ESB.ERROR.DETAILS.LOCAL)
   TYPE(QUEUE)                             CURDEPTH(5)
   IPPROCS(0)                              LGETDATE(2019-06-30)
   LGETTIME(11.18.14)                      LPUTDATE(2019-07-01)
   LPUTTIME(10.02.58)                      MEDIALOG( )
   MONQ(LOW)                               MSGAGE(25991)
   OPPROCS(0)                              QTIME(999999999, 999999999)
   UNCOM(NO)

2019-07-01 10:10:54 -Adeba Shariff(工作说明)  分流完成

2019-07-01 09:37:55-Adeba Shariff(工作说明) 确认。

2019-07-01 07:57:44-Shreya Inamdar(工作笔记) Tivoli Enterprise Portal警报:

  1. 发生的日期/时间:19/07/01 07:50:25 3分钟19/01/19 07:53:41
  2. 严重性:严重或警告
  3. 情况名称:RL1_WMBLOG_ERROR
  4. 影响:UNIX日志
  5. 情况事件结果:

brokerlog.log错误

  

[IS.ISR.SalesReport] rlap1mqs:KUL / var / mqsi / common / log / 19/01/19 07:52:29 2322子SQL异常IIBP01HA1IS.ISR23003278SalesReportNode> SalesReport.ConvertToXML 0 0 07/01/19 07: 52:29 / var / mqsi / common / log / brokerlog.log [IS.ISR.SalesReport] 2322儿童SQL异常   IIBP01HA1IS.ISR23003278SalesReportSalesReport.ConvertToXML

---------带有文本行的示例单元格结束--------------------------- ---------------------------

我正在尝试从上面的单元格中提取日期时间戳(在上面的示例文本中以粗体突出显示),并根据条件“ 分类完成” ”。

换句话说,我需要一个公式来提取2019-07-01 10:10:54(从上面显示的单元格数据中),这是分流完成时的时间戳。

我有一堆带有不同文本的单元格,但是所有单元格中的单元格中都有文本“ Triage complete”,并且在要提取的文本上方有一个时间戳。

我尝试了LEFT,MID,INDEX和FIND无济于事。

不胜感激。谢谢。

=LEFT(A2, SEARCH("Triage completed",A2,1)-1) 结果与预期不符

我希望根据日期的时间戳从上面的给定单元格中提取日期条件,条件是该条件在该单元格中找到字符串“ Triage complete”。

1 个答案:

答案 0 :(得分:0)

我建议在VBA中编写用户定义函数(UDF)并使用正则表达式。

要输入此用户定义函数(UDF),<alt-F11>将打开Visual Basic编辑器。 确保您的项目在“项目浏览器”窗口中突出显示。 然后,从顶部菜单中选择插入/模块,然后 将下面的代码粘贴到打开的窗口中。

要使用此用户定义函数(UDF),请在某些单元格中输入类似=triageComplete(A1)的公式。

实际上,如果格式为<date/time … some text-newline-Triage Complete>,并且日期/时间始终与您显示的格式完全相同,请尝试:

Option Explicit
Function triageComplete(S As String) As Date
    Dim RE As Object, MC As Object

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .ignorecase = True
    .Pattern = "\b(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\b.*\n.*Triage Completed"
    .MultiLine = True
    If .Test(S) = True Then
        Set MC = .Execute(S)
        triageComplete = MC(0).submatches(0)
    End If
End With
End Function

如果格式可能不同,则需要更具体。

上面的UDF适用于复制/粘贴的数据,尽管您可能必须格式化公式返回其结果的单元格。