使用关联的 tag/unit 提取数据

Extracting data with an associated tag/unit

我一直在尝试分离出隐藏在文本句子中的关键数据,例如:

我在使用以下代码方面取得了一些进展,但它也提取了不需要的值:

let
    Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Input", type text}, {"Desired OutPut", type any}, {"Bonus", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each if Text.Contains([Input], "mmHg") then Text.Remove([Input],Text.ToList(Text.Remove([Input],{"0".."9","-", " ", "."}))) else null),
    #"Trimmed Text" = Table.TransformColumns(#"Added Custom",{{"Custom", Text.Trim, type text}})
in
    #"Trimmed Text"

如您所见,正在提取其他数值数据。

不过,我认为遵循这些规则可能是错误的做法,我想知道是否可以使用 mmHg 作为标签来提取“附近”数据。理想情况下,值或范围将触及“mmHg”,但在某些情况下情况并非如此,因此出现了附近逻辑的想法。我很高兴我可以删除除数字和 mmgH 之外的所有数据,但是我认为如果可能的话,这种标记的想法将非常有用。在我看来,我的想法是:如果文本包含 mmHg,则在 X 个字符(比如说左边的 10 个字符)内搜索 {0..9,"-"}。这可能吗?

作为额外的一种,我将尝试提取发现这种压力的眼睛。在这里,我希望使用一些软逻辑和先到先得的原则。我认为这是一个很好的假设,即第一个压力将与每个句子中第一个提到的眼睛有关。我不确定如何在 M 代码中执行此操作。然而,这可能需要一个单独的问题。

我认为你可以在这里使用正则表达式:


步骤 1):

将自定义函数添加到您的 table:

在这种情况下,我将其称为 'fnRegexExtr'(很像您之前提出的问题)。我使用的源函数来自here,是一个regex-replace函数。

(x,y,z)=>
let 
   Source = Web.Page(
                     "<script>var x="&"'"&x&"'"&";var z="&"'"&z&
                     "'"&";var y=new RegExp('"&y&"','g');
                     var b=x.replace(y,z);document.write(b);</script>")
                     [Data]{0}[Children]{0}[Children]{1}[Text]{0}
in 
   Source

步骤 2):

在 'Add Column' 选项卡上,调用此自定义函数。使用以下参数:


步骤 3):

我们可以使用具有不同参数的相同函数添加另一列:

请注意尾随空格。在捕获组 1 之间使用空格使得 PQ 将 auto-trim 结果。


步骤 4):

在选项卡 'Transform' 下,我只是用 'null' 值替换了错误。


步骤 5):

编辑了 M-code 以用 comma-space 分隔符替换值之间的空格。


结果:


M-Code:

let
    Source = Excel.CurrentWorkbook(){[Name="Tabel1_2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Input", type text}}),
    #"Invoked Custom Function" = Table.AddColumn(#"Changed Type", "mmHg", each Text.Replace(fnRegexExtr([Input], "(\d+(?:-\d+)?)\D*mmHg|.", " ")," ",", ")),
    #"Invoked Custom Function1" = Table.AddColumn(#"Invoked Custom Function", "Side", each Text.Replace(fnRegexExtr([Input], "\b(right|left)\s*eye\b|.", " ")," ",", ")),
    #"Replaced Errors" = Table.ReplaceErrorValues(#"Invoked Custom Function1", {{"mmHg", null}, {"Side", null}})
in
    #"Replaced Errors"