【问题标题】:Excel extract text from cells containing large amounts of textExcel 从包含大量文本的单元格中提取文本
【发布时间】:2021-11-17 01:19:27
【问题描述】:

我有一个电子表格,其中包含来自 IT 票务系统的票务数据。我需要从中提取数据的字段是非索引文本字段,因此我无法在票证系统本身中搜索该字段。我已将数据导出到 Excel 中,其中每个工单的整个工作备注字段位于一个单元格中。输出如下所示:

2021-09-21 17:15:41 John Smith [Work Notes] - Update inside ticket 2021-09-21 16:12:39 Jane Doe [Work Notes] - Another update inside ticket.

我想要做的是捕获各个工作笔记并将它们分成自己的列,以便我可以计算更新之间的时间并计算每个人进行的更新次数。计算更新很容易,我使用了一个简单的 CountIF 公式来获取每个人在我导出的工单中进行更新的总次数。困难的部分是如何将每个更新拆分到自己的单元格中。

我已经清理了数据,以便唯一使用时间括号 ([ ] ) 用于 [工作笔记] 或 [附加评论](客户可见的工作笔记条目)。然后我尝试使用右括号作为分隔符向 cmets 发送文本,但这适用于将第一个条目拆分到它自己的单元格中,但下一个单元格将包含前一个条目的注释,然后是下一个条目。所以它看起来像这样:

2021-09-21 17:15:41 John Smith [Work Notes
*next cell*
- Update inside ticket 2021-09-21 16:12:39 Jane Doe [Work Notes

等等。这实际上不起作用,因为我仍然无法执行时间计算并开始混淆工单中的不同更新。

有没有人提出更好的方法来做到这一点?如果需要,我愿意使用 VBA。感谢您的帮助!

【问题讨论】:

    标签: excel vba excel-formula


    【解决方案1】:

    这可以通过查找/替换然后文本到列来完成。

    2021-09-21 17:15:41 John Smith [Work Notes] - Update inside ticket 2021-09-21 16:12:39 Jane Doe [Work Notes] - Another update inside ticket.

    由于日期是条目的开头,因此您只需在日期前添加一个字符。这可以是您知道不会出现在其余消息中的任何内容。

    完成此操作后,您可以使用 text-to-columns 选择特殊字符作为分隔符。

    【讨论】:

    • 叹息。谢谢。不敢相信我没想到。我猜有时你只需要第二双眼睛。干杯。
    • 这很聪明,但确实依赖于不改变月份/年份的日期。
    • @SJR 我刚刚使用了这一年,效果很好。如果我还有一年,那么替换那一年也应该不是问题。我现在遇到的困难是如何执行时间计算,因为每张票的列数变化很大,具体取决于票的更新次数。
    • @SJR 在问题中提到它来自 IT 票务系统,因此日期将遵循可靠格式是合理的,因此如果问题确实涉及多年的数据,那么可能需要几遍查找/替换。如果需要,VBA 循环可以解决这个问题。
    • 是的,还是投了赞成票。
    【解决方案2】:

    使用 Microsoft365 公式:

    A3中的公式:

    =FILTERXML("<t><s>"&CONCAT(IF(ISNUMBER(SEARCH(" ????-??-?? ??:??:??",MID(A1,SEQUENCE(LEN(A1)),20))),"</s><s>",MID(A1,SEQUENCE(LEN(A1)),1)))&"</s></t>","//s")
    

    显然将其嵌套在 TRANSPOSE() 中以将其溢出到列中,但为了在屏幕截图中可见,我选择不这样做。


    编辑:

    我只能猜测您的后续问题,但如果您想更好地分析数据,例如 DateTime-Stamp;Person;Ticket 您可以尝试以下操作:

    B3中的公式:

    =CHOOSE({1,2,3},--LEFT(A3#,19),MID(A3#,21,FIND(" [",A3#,20)-21),MID(A3#,FIND("] - ",A3#)+4,LEN(A3#)))
    

    如您所见,它将所有不同的数据分散到单独的列中。

    现在,如果可以访问LET(),所有这些都可以浓缩成一个公式。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      使用正则表达式。将字符串放在 Sheet1 的 A 列中。

      Option Explicit
      
      Sub extract()
          
          Dim wb As Workbook, ws As Worksheet, cell As Range
          Dim lastRow As Long, i As Integer, j As Integer
          Dim c As Long, s As String
      
         ' build regex pattern
          Dim regex As Object, m As Object
          Set regex = CreateObject("vbscript.regexp")
          With regex
             .Global = True
             .MultiLine = False
             .IgnoreCase = True
             .Pattern = "((20\d\d-\d\d-\d\d \d\d:\d\d:\d\d)(.*?)(\[[^]]*\]))" ' pattern
          End With
      
          ' data
          Set wb = ThisWorkbook
          Set ws = wb.Sheets("Sheet1")
          lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
      
          For Each cell In ws.Range("A1").Resize(lastRow)
               s = cell.Value
               c = 1
               If regex.test(s) Then
                  Set m = regex.Execute(s) '
                  For i = 1 To m.Count
                      For j = 2 To m(i - 1).submatches.Count
                           cell.Offset(0, c) = m.Item(i - 1).submatches(j - 1) ' matched term
                           c = c + 1
                      Next
                  Next
              End If
          Next
      
          MsgBox lastRow & " rows parsed", vbInformation
      
      End Sub
      

      【讨论】:

      • 这很好用。谢谢!
      猜你喜欢
      • 2016-12-17
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多