【问题标题】:Split string of email recipients into array in Powershell在Powershell中将电子邮件收件人字符串拆分为数组
【发布时间】:2016-12-13 15:02:08
【问题描述】:

我正在 Powershell 中编写一个脚本,以获取通用格式 """Name One"" <email one>, ""Name Two"" <email two>" 的电子邮件收件人列表,并输出可以解析为 CSV(在 Powershell 外部)的收件人列表。该列表来自 CSV 中的一个单元格,我无法控制其格式。我无法直接将列表本身解析为 CSV:因为每封电子邮件没有特定数量的收件人,所以我无法指定标题,并尝试通过删除初始和结束引号将其解析为 CSV 导致引用不正确名称(以及名称包含逗号时的潜在问题)。

到目前为止,我已经意识到我可以将字符串加载为 CSV,这会将上面的示例转换为 "Name One" <email one>, "Name Two", <email two>",如果我可以使用逗号进行拆分,那将是完美的。不幸的是我不能,因为有时人们的名字会显示为"Three, Name",我不能在一个人的名字中间分开。我需要的是某种方法可以用其他字符(或一系列字符)替换引号外的逗号。如果我能做到这一点,那么我的其余过程将完美无缺;实际上,我遇到了问题,因为我使用的快速组合的正则表达式无法正确捕获没有电子邮件地址的收件人。

我目前唯一的想法是编写一个解析器,该解析器遍历每个字符,跟踪它遇到的引号数量,并在该数字为偶数时替换逗号。我宁愿不这样做;有很多 数据,如果可能的话,我宁愿更快。我现在会以这种方式实现它,但我希望我能在这里得到更好的解决方案。

编辑:澄清格式:大多数电子邮件的格式为""Something"" <addr@example.org>,但并非全部都是。除此之外,最常见的格式只是名称(尖括号中没有任何内容),但除此之外,大多数电子邮件确实遵循双引号后跟尖括号中的某些内容的格式。我真的无法抽出所有不同的格式;我收到的消息太多,只有少数是例外。

【问题讨论】:

  • 我猜你的第二个例子有第二个逗号在错误的地方? “没有电子邮件地址的收件人”如何出现? “将字符串加载为 CSV”是什么意思? PowerShell ConvertFrom-CSV 将返回对象,而不是其中包含逗号的字符串..?
  • '"Name One" <email one>, "Name Two" <email two>' | ConvertFrom-Csv -Header A, B
  • @TessellatingHeckler 在第二个示例中,名称采用“姓氏,名字”格式,而不是“名字姓氏”格式。至于没有电子邮件地址的收件人,他们会显示姓名但没有电子邮件:"Name Three" 而不是 "Name Three" <email three>。数据格式不是很好。
  • @AnsgarWiechers 如果我在每封电子邮件上都有特定数量的收件人,那将是完美的;唉,我已经看到了多达几百个,我不能真正指定那个标题。
  • 您想要实现的究竟是什么?将不同数量的电子邮件地址解析为 CSV 并没有多大意义。拆分数据后,您想如何处理数据?

标签: powershell csv


【解决方案1】:

您可以使用this nifty trick 仅匹配逗号后跟偶数个引号:

PS C:\> $pattern = ',(?=(?:[^"]*"[^"]*")*[^"]*$)\s?'
PS C:\> $mailAddresses = '"John Doe" <john@doe.example>, "Doe, Jane" <jane@doe.example>'
PS C:\> $mailAddresses -split $pattern
"John Doe" <john@doe.example>
"Doe, Jane" <jane@doe.example>

【讨论】:

  • 谢谢!我认为这将完美地工作。我将不得不等到稍后再实施它,但它应该是比我目前的“遍历每个角色”更快的解决方案......
【解决方案2】:

试试这个

$yourlist = '"John Doe" <john@doe.example>, "Doe, Jane" <jane@doe.example>'
$yourlist -replace ">, ", "`n" -replace "<|>|,", "" | ConvertFrom-Csv -Delimiter " " -Header Name, Email

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多