【问题标题】:Extract substring from a string using sub pattern in power bi使用power bi中的子模式从字符串中提取子字符串
【发布时间】:2022-01-23 12:39:33
【问题描述】:

假设我在一列中有一行文本:

“流程”“DIT-Start-Auto Generate Incidents””在 DF Operations 中启动。 见 "

从上面的文本中,我只想使用模式 INC 提取 INC3294144,其中 INC (3294144) 之后的剩余部分是动态的并且会随着场景而变化。

【问题讨论】:

    标签: powerbi powerquery


    【解决方案1】:

    在 Power Query 中,您可以使用以下代码创建新的自定义列-

    Text.Start( Text.Range([your_column_name],Text.PositionOf([your_column_name],"INC")),Text.PositionOf(Text.Range([your_column_name],Text.PositionOf([your_column_name],"INC"))," "))
    

    如果文本中没有 INC,则返回 null,请在下面使用 -

    if Text.PositionOf([your_column_name],"INC") = -1 then
    null
    else
    Text.Start( Text.Range([your_column_name],Text.PositionOf([your_column_name],"INC")),Text.PositionOf(Text.Range([your_column_name],Text.PositionOf([your_column_name],"INC"))," "))
    

    输出将如下所示-

    【讨论】:

    • 如果没有找到 INC,我想返回空值怎么办。
    • 使用 if 条件,当 PositionOf "INC" 返回 null 时返回 null
    • @TathagataBaisya 请检查我的更新答案
    【解决方案2】:

    从您的问题中很难判断所有数据是否都是您正在检查的一个单元格?

    如果是这样,您可以使用自定义列来检查名为 a

    的列
    = try Text.Middle([a],Text.PositionOf([a],"INC"),Text.PositionOf(Text.Middle([a],Text.PositionOf([a],"INC"),999)," ")) otherwise null
    

    【讨论】:

      【解决方案3】:

      你实际上可以使用正则表达式

      • 将此代码粘贴到空白查询中:
      //see http://www.thebiccountant.com/2018/04/25/regex-in-power-bi-and-power-query-in-excel-with-java-script/
      // and https://gist.github.com/Hugoberry/4948d96b45d6799c47b4b9fa1b08eadf
      
      let   fx=(text,regex)=>
          Web.Page(
              "<script>
                  var x='"&text&"';
                  var y=new RegExp('"&regex&"','g');
                  var b=x.match(y);
                  document.write(b);
              </script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}
      
      in
      fx
      
      • 用一个有用的名字重命名它:我用fnRegex
      • 然后您可以像这样使用 M-Code 使用下面的 Regex 模式添加自定义列
         #"Invoked Custom Function" = Table.AddColumn(#"Changed Type", "INC", each fnRegex([Column1], "INC[0-9]+"))
      

      【讨论】:

        【解决方案4】:

        我认为一个简单的 Text.BetweenDelimiters 应该在这里工作:

        Text.BetweenDelimiters([TextCol], "app? ", " service=")
        

        如果没有匹配,这将返回一个空字符串。

        当然,这确实取决于这些分隔符的存在,并且您可能需要像这样不那么严格的匹配条件(这仍然会做出一些在您的特定情况下可能不成立的假设):

        Text.BetweenDelimiters([TextCol], "? ", " ")
        

        【讨论】:

          猜你喜欢
          • 2011-07-21
          • 1970-01-01
          • 2021-08-01
          • 1970-01-01
          • 2017-04-01
          • 2015-05-10
          • 2017-01-31
          • 1970-01-01
          相关资源
          最近更新 更多