【问题标题】:Replace Invalid Email Format with a Valid One用有效的电子邮件格式替换无效的电子邮件格式
【发布时间】:2020-01-25 20:47:54
【问题描述】:

在 Power Query 中,我有一个包含无效电子邮件的电子邮件列表。我希望使用 M 代码来识别和“修复”它们。例如,我的电子邮件列表将包含类似“1234.my_email_gmail_com@error.invalid.com”的内容

我正在寻找 Power Query 以查找类似的电子邮件地址,然后生成有效电子邮件的输出。对于上面的示例,它应该是“my_email@gmail.com”

基本上,我想做以下事情:

  • 去掉前面的数字(位数不同)
  • 删除“@error.invalid.com”
  • 将右边第一个下划线“_”替换为“.”
  • 将右边第二个下划线“_”替换为“@”

我还是 Power Query 的新手,尤其是 M 代码。感谢我能得到的任何帮助和指导。

【问题讨论】:

  • 寻找一种叫做模糊匹配的东西

标签: if-statement replace powerquery


【解决方案1】:

试试下面的函数cleanEmailAddress:

let
    cleanEmailAddress = (invalidEmailAddress as text) as text =>
        let
            removeLeadingNumbers = Text.AfterDelimiter(invalidEmailAddress, "."), // Assumes invalid numbers are followed by "." which itself also needs removing.
            removeInvalidDomain = Text.BeforeDelimiter(removeLeadingNumbers, "@"),
            replaceLastOccurrence = (someText as text, oldText as text, newText as text) as text =>
                let
                    lastPosition = Text.PositionOf(someText, oldText, Occurrence.Last),
                    replaced = if lastPosition >= 0 then Text.ReplaceRange(someText, lastPosition, Text.Length(oldText), newText) else someText
                in replaced,
            overwriteTopLevelDomainSeparator = replaceLastOccurrence(removeInvalidDomain, "_", "."),
            overwriteAtSymbol = replaceLastOccurrence(overwriteTopLevelDomainSeparator, "_", "@")
        in overwriteAtSymbol,
    cleaned = cleanEmailAddress("1234.my_email_gmail_com@error.invalid.com")
in
    cleaned

关于:

  • “去掉前面的数字(位数不同)”

您的问题没有提到如何处理前导 .(如果您删除前导数字,它仍然存在),但您的预期输出 ("my_email@gmail.com") 建议应该删除它。前导数字后没有. 的电子邮件地址将返回错误(removeLeadingNumbers 表达式的逻辑需要改进)。

【讨论】:

  • 谢谢。是的,前导“。”在数字之后也应该被删除。作为 Power Query 中的菜鸟,我复制了上面的代码并将“1234.my_email_gmail_com@error.invalid.com”替换为电子邮件列。对于大多数有效的电子邮件地址,他们返回“com”或类似的东西。我认为我可以使用它来帮助我确定需要修复哪些问题,但后来我意识到诸如“valid.email@ymail.com”之类的有效电子邮件将作为“电子邮件”返回。关于如何避免这种情况的任何建议?
  • 没关系,我能够使用条件列仅显示有效的电子邮件地址,按照上面的公式进行。如果您确实有可以提供帮助的代码,我会很乐意接受。但是,我只是能够操纵数据以获得我需要的最终输出。再次感谢!
【解决方案2】:

这似乎也有效:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Added Custom" = Table.AddColumn(Source, "Valid", each Text.ReplaceRange(Text.ReplaceRange(Text.BetweenDelimiters([Column1],".","@"),Text.PositionOf(Text.BetweenDelimiters([Column1],".","@"),"_",Occurrence.Last),1,"."),Text.PositionOf(Text.ReplaceRange(Text.BetweenDelimiters([Column1],".","@"),Text.PositionOf(Text.BetweenDelimiters([Column1],".","@"),"_",Occurrence.Last),1,"."),"_",Occurrence.Last),1,"@"))
in
    #"Added Custom"

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 2012-05-28
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多