PowerQuery(M):如何从大型文本字段中提取date?

我的表有一个称为Remarks的文本列,通常包含大量的文本。

这是一个例子:
3/24/2017 11:14:41 AM – EMD FOR STATUS NFU 3/30/17
2017/3/30 10:58:03 – CL每个接收者通用汽车UNAVAILABLE NFU 04-13-2017
4/13/2017 11:10:15 – CLD每接收器将提供信息NFU4 / 27
2017/4/27 9:02:20 – MLD INV 90天邮票
2017/4/27 9:15:03 – 每个REP都会打电话给客户付款
2017/4/27 11:03:46 – NFU 05/5每个客户混乱
2017/5/5 8:55:17 – NFU 5/9/2017 CRP PER REP CHECK WAS MLD 5/2/17

所有这些文本将被塞进一个单一的领域,我需要从字段中提取最后的NFUdate用于计算和过滤。

在上面的例子中,我想从最后一行提取5/9/2017的date。
但是,正如你所看到的那样,date可以是任何格式,在任何地方。

我认为Excel可以将文本parsing为任何上述格式的date值(如果不是这样,我会以其他方式处理 – 员工培训等)

我需要弄清楚如何使用PowerQuery的主要事情是:

  • 在此字段中查找“ NFU ”的最后一个实例
  • 在最后一个“ NFU ”实例之后立即提取所有文本,包括“ NFU ”和date之间的空格(如果存在)。
    在这一点上,结果应该是:
    " 5/9/2017 CRP PER REP CHECK WAS MLD 5/2/17"
  • 删除string开始处的任何whitepsace。
    在这一点上,结果应该是:
    "5/9/2017 CRP PER REP CHECK WAS MLD 5/2/17"
  • find不是0-9的第一个字符, /- (或string的末尾,以先到者为准)
  • 如果合适的话,截断第一个非date字符处的string。
    在这一点上,结果应该是:
    "5/9/2017"
  • 最后,尝试将生成的文本格式化为Datetypes/格式,并作为PowerQuery自定义列的结果返回。

看看可用的PowerQuerystring函数,我不确定这是否可能。

我猜你是指Power Query Text函数。 这些确实有些有限,但Power Query的函数库中还有很多其他选项:在这种情况下,List函数可以帮助您解决问题。

顺便说一句:我检查了“NFU”,以避免“CO NFU SION”(在你的例子中最后一行)。

 let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], Typed = Table.TransformColumnTypes(Source,{{"example", type text}}), LastNFU = Table.AddColumn(Typed, "LastNFU", each Text.PositionOf([example]," NFU",Occurrence.Last), Int64.Type), AfterNFU = Table.AddColumn(LastNFU, "AfterNFU", each if [LastNFU] = -1 then null else Text.Range([example],[LastNFU]+4)), Trimmed = Table.TransformColumns(AfterNFU,{{"AfterNFU", Text.Trim}}), TextToList = Table.TransformColumns(Trimmed,{{"AfterNFU", each if _ = null then {} else Text.ToList(_)}}), ListFirstN = Table.TransformColumns(TextToList,{{"AfterNFU", each List.FirstN(_, each Text.Contains("01234567890-/",_))}}), TextCombine = Table.TransformColumns(ListFirstN, {"AfterNFU", Text.Combine, type text}), Date = Table.TransformColumnTypes(TextCombine,{{"AfterNFU", type date}}, "en-US"), Renamed = Table.RenameColumns(Date,{{"AfterNFU", "Date"}}), Removed = Table.RemoveColumns(Renamed,{"LastNFU"}) in Removed 

一个简单的公式如= RIGHT(A1,LEN(A1) – (FIND(“NFU”,A1,1)-1))将提取NFU旁边的string。 假设文本在单元格A1。 但需要进一步深入挖掘,以获得您的其他要求。