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 - 删除包含小写字母的文本字符串的主要内容,如果未能解决你的问题,请参考以下文章

Power Query:如何为列表中的每一行添加列

Power Query - 替换新列中的文本

Power Query 倾斜数据

输入一串长度为n的,只包含大写小写字母的字符串,将其中的大写字母删除后输出 (由于oj原因,字符?

power BI-数据处理(跟power query几乎一样)

powerquery的sum公式