【问题标题】:How to extract a line from a text in a cell based on certain criteria如何根据特定条件从单元格中的文本中提取一行
【发布时间】:2019-08-04 11:04:17
【问题描述】:

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

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

2019-07-01 11:42:20 - Adeba Shariff(工作笔记)

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

错误文本:

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

再处理前:-

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) 

解决方案:我们使用备份忽略这些失败消息,因为这是违反主键问题。如果我们需要采取任何行动,请告诉我们。

再加工后:

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. 发生日期/时间:07/01/19 07:50:25 3 分钟 07/01/19 07:53:41
  2. 严重性:严重或警告
  3. 情况名称:RL1_WMBLOG_ERROR
  4. 影响:UNIX 日志
  5. 情境事件结果:

brokerlog.log 错误

[IS.ISR.SalesReport] rlap1mqs:KUL /var/mqsi/common/log/ 07/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] 2322Child SQL 异常 IIBP01HA1IS.ISR23003278SalesReportSalesReport.ConvertToXML

---------EXCEL 中带有文本行的示例单元格的结尾-------------- --------------------------

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

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

我有一堆包含不同文本的单元格,但所有单元格的单元格中都有“分类完成”文本,并且在该文本上方有一个我要提取的时间戳。

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

不胜感激,如果你能在这里阐明一些观点。谢谢。

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

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

【问题讨论】:

  • 请注意
  • 请注意,以下文本行分别位于两行不同的行中(与问题中显示的示例文本不同)。即“Triage Completed”文本位于上面文本中显示的日期时间戳的下一行(2019-07-01 10:10:54 - Adeba Shariff(工作笔记))

标签: excel


【解决方案1】:

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

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

要使用此用户定义函数 (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 适用于您复制/粘贴的数据,但您可能必须格式化公式返回其结果的单元格。

【讨论】:

  • 感谢您的快速周转。我尝试了上面的代码,它返回#NAME?在结果单元格中。我尝试格式化此单元格,但徒劳无功。我错过了什么吗?顺便说一句 - 数据/时间始终采用与我上面提到的相同的格式。
  • 我想我现在可以运行它并得到结果。但是我收到的输出只是时间而不是日期!我现在看到 10:10:54 但看不到日期!!
  • @user3736290 这可能是由于单元格格式不正确。
  • 我已经获得了想要的结果,非常感谢你,Ron!非常感谢您使用代码让我的生活更轻松。真的很感激!祝你有美好的一天先生:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
相关资源
最近更新 更多