仅从列表中获取唯一条目

时间:2017-03-20 09:19:12

标签: excel-vba powershell vba excel

我有一个电子邮件地址列表,其中很多都有相同的域名。

所以说我们有一个这样的列表:

  • User1@domain.com

  • User2@domain.com

  • User3@domain.com

  • User1@domain2.com

  • User2@domain2.com

我想要的是删除我不需要的物品:

  • User2@domain.com
  • User3@domain.com
  • User2@domain2.com

仅离开:

  • User1@domain.com
  • User1@domain2.com

我已经设法创建一个PS脚本,您可以在其中删除CSV文件中包含我们不需要的电子邮件地址的行,但问题是该脚本正在删除包含该字符串的每个地址:

Get-Content 'C:\list.csv' | Where-Object {$_ -notmatch 'domain'}| Set-Content C:\out.csv

因此,如果我使用此脚本,它将删除包含“domain”的每一行,但我想保存包含它的第一行。

3 个答案:

答案 0 :(得分:3)

尝试:

#Seems this is a txtfile and not csv, so we'll just read it as text
Get-Content 'C:\list.csv' |
#Group by domain
Group-Object { $_ -replace '^.*@' } |
#Get first address per domain
ForEach-Object { $_.Group[0] } |
#Save to file
Set-Content C:\out.csv

输出:

User1@domain.com
User1@domain2.com

如果您只需要域名,可以使用:

#Read file
Get-Content 'C:\list.csv' |
#Group by domain
Group-Object { $_ -replace '^.*@' } |
#List group names (domain names)
Select-Object -ExpandProperty Name |
#Save to file
Set-Content C:\out.csv

输出:

domain.com
domain2.com

答案 1 :(得分:0)

如果您只想为每个唯一的电子邮件地址添加一个匹配项,则可以使用select-object -unique:

Get-Content 'C:\list.csv' | Select-Object -Unique | Set-Content C:\out.csv

虽然您希望每个电子邮件域都有一个唯一条目。它是哪个条目有关系吗?以下PowerShell代码将获得每个域的第一个匹配项(它假定您的CSV文件的标题为" emailaddress"用于电子邮件地址字段:

Import-CSV 'list.csv' | ForEach-Object { 
    $_ | Add-Member –MemberType NoteProperty –Name Domain -Value ($_.emailaddress -split '@')[1] 
    Write-Output $_
} | Group-Object Domain | ForEach-Object { $_ | Select -ExpandProperty Group | Select emailaddress -First 1 }

答案 2 :(得分:0)

您可以使用Dictionary仅存储唯一的域。

下面的代码将遍历A列中的所有电子邮件地址(从单元格" A2&#34开始; - 您可以修改以满足您的需要),然后使用Split功能进行拆分电子邮件地址和域名(进入EmailArr数组)。

然后,确认代表域名的EmailArr(1)是唯一的,确保它不在Dictionary中,您可以通过以下代码行实现此目的:{{1 } - >就是这样,你有一个只存储唯一域名的`词典。

最后,我添加了一个循环来显示If Not Dict.exists(EmailArr(1)) Then中的唯一域名(您可以将它们放在数组或范围中)。

<强>代码

MsgBox