使用关联的 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' 选项卡上,调用此自定义函数。使用以下参数:
x
- 输入
y
- (\d+(?:-\d+)?)\D*mmHg|.
z
-
步骤 3):
我们可以使用具有不同参数的相同函数添加另一列:
x
- 输入
y
- \b(right|left)\s*eye\b|.
z
-
请注意尾随空格。在捕获组 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"
我一直在尝试分离出隐藏在文本句子中的关键数据,例如:
我在使用以下代码方面取得了一些进展,但它也提取了不需要的值:
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' 选项卡上,调用此自定义函数。使用以下参数:
x
- 输入y
-(\d+(?:-\d+)?)\D*mmHg|.
z
-
步骤 3):
我们可以使用具有不同参数的相同函数添加另一列:
x
- 输入y
-\b(right|left)\s*eye\b|.
z
-
请注意尾随空格。在捕获组 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"