Power Query - 删除包含小写字母的文本字符串
Posted
技术标签:
【中文标题】Power Query - 删除包含小写字母的文本字符串【英文标题】:Power Query - Remove text strings that contain lower case letters 【发布时间】:2021-10-07 19:03:04 【问题描述】:情况:我正在使用从 pdf 文件导入的数据在 Power Query 中工作,结果有点混乱。我有一列包含数字以及文本字符串。一些文本字符串是大小写混合的,包含大小写字符,而另一些则只包含大写字符。
目标:我想删除所有数字和所有大小写混合的文本字符串。最终结果应该只显示完全大写的文本字符串。
例如,我希望我的最终结果包括 IRA、IRREVOCABLE TRUST、CHARITABLE TRUST 等内容,但将 Number of Accounts、Totals、14 等内容替换为 null。
到目前为止我所尝试的:
以下内容去掉了数字和小写字符,但它并不完全有效,因为它保留了混合大小写字符串中包含的大写字符。
Table.AddColumn(#"Added Custom2", "Account Type" each Text.Select([AccountType], "A".."Z"," "), type text)
下面的代码去掉了大小写混合的文本字符串,但它并不能很好地工作,因为它没有删除数字。另外,它太具体了,需要我删除包含特定单词的字符串。我希望删除所有包含小写字符的字符串。
Table.AddColumn(#"Added Custom2", "Account Type", each if [AccountType]= null or Text.Contains([AccountType],"Totals") or Text.Contains([AccountType],"of" ) 或 Text.Contains([AccountType],"report") then null else [AccountType])
您的见解将不胜感激。我是 PowerQuery 的新用户,所以请具体详细地回答您的问题。
【问题讨论】:
【参考方案1】:由于您没有提供数据示例,因此很难确切知道您想要什么。
如果单元格中有多个(以空格分隔的)字符串,则可以使用: #"Added Custom" = Table.AddColumn(#"Changed Type", "allCaps", each
Text.Combine(
List.Accumulate(Text.Split([Column1]," "),
,
(state, current)=>
if List.ContainsAny(
Text.ToList(current),
"0".."9","a".."z",",",":","?","/","\"," ")
then state
else state & current),", "))
如果单元格中只有一个字符串,则可以使用
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each
if List.ContainsAny(
Text.ToList([Column1]),
"0".."9","a".."z",",",":","?","/","\"," ")
then null
else [Column1])
然后你可以通过取消选择添加列中的null进行过滤
在每种情况下,#"Changed Type"
都是上一步。如果您的代码中不是这种情况,请替换为上一步的实际名称
【讨论】:
我编辑了我的问题以包含一些示例。在尝试您提供的第一个代码时,我遇到了语法错误(应为标记逗号)。这正是我输入的内容: = #"Added Custom" = Table.AddColumn(#"Added Custom2", "Account Type", each Text.Combine(List.Accumulate(Text.Split([AccountTypeHelperColumn]," "), , (state, current) => if List.ContainsAny(Text.ToList(current),"0".."9","a".."z",",",":"," ?","/","\",","") 然后声明 else state & current]),", ")) @Qqqqq 您在输入的内容中有几个错误。我建议您从我发布的代码中复制/粘贴,然后编辑相关参考。或者将其输入到add Column
对话框(在 each
之后开始)并在那里编辑相关引用。
嗯,好的。我使用了复制/粘贴,语法错误消失了,但结果列只显示每个单元格中的错误。
@Qqqqq 是什么错误?
我怎么知道?【参考方案2】:
第一个公式只查找所有不包含数字的大写字母
= if [Column1] = Text.Remove ([Column1],"0".."9","a".."z") then [Column1] else null
第二个公式删除所有数字,然后查找所有不包含数字的大写字母
= if Text.Remove ([Column1],"0".."9") = Text.Remove ([Column1],"a".."z","0".."9") then Text.Remove ([Column1],"0".."9") else null
let Source = Excel.CurrentWorkbook()[Name="Table2"][Content],
#"Changed Type" = Table.TransformColumnTypes(Source,"Column1", type text),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each if [Column1] = Text.Remove ([Column1],"0".."9","a".."z") then [Column1] else null),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Custom2", each if Text.Remove ([Column1],"0".."9") = Text.Remove ([Column1],"a".."z","0".."9") then Text.Remove ([Column1],"0".."9") else null)
in #"Added Custom1"
~~~
如果您要从单词列表中解析单词......
这会保留 (a) 在之前或之后没有数字的单词,并且 (b) 都是大写的
let Source = Excel.CurrentWorkbook()[Name="Table1"][Content],
#"Changed Type" = Table.TransformColumnTypes(Source,"Column1", type text),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each
Text.Combine(
List.RemoveNulls(
List.Transform(Text.Split([Column1]," "), each
if _ = Text.Remove (_,"a".."z","0".."9") then _ else null
))," "))
in #"Added Custom"
这会删除所有数字,然后保留所有大写的单词
let Source = Excel.CurrentWorkbook()[Name="Table1"][Content],
#"Changed Type" = Table.TransformColumnTypes(Source,"Column1", type text),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each
Text.Combine(
List.RemoveNulls(
List.Transform(Text.Split(Text.Remove ([Column1],"0".."9")," "), each
if _ = Text.Remove (_,"a".."z") then _ else null
))," "))
in #"Added Custom"
【讨论】:
第一个公式可能更像我正在寻找的。我不需要解析任何内容,只需消除所有不是大写文本字符串的内容。不幸的是,当我尝试使用您的公式时,我得到了一列充满错误值的列。 也许向 Ron 和我展示您的示例输入数据和当前代码。我们知道我们的代码有效,这是一个实施问题以上是关于Power Query - 删除包含小写字母的文本字符串的主要内容,如果未能解决你的问题,请参考以下文章
输入一串长度为n的,只包含大写小写字母的字符串,将其中的大写字母删除后输出 (由于oj原因,字符?