【问题标题】:Get only unique entries from a list仅从列表中获取唯一条目
【发布时间】:2017-08-11 12:03:05
【问题描述】:

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

假设我们有一个这样的列表:

  • 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

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

【问题讨论】:

  • 您的文件是否包含其他内容,或者仅包含邮件地址列表(每行一个)?
  • 您能否确认您正在尝试从电子邮件地址列表中获取唯一的域名?
  • 是的,我可以确认我正在尝试从列表中获取唯一的域名。它自己的列表只包含地址,没有其他内容。
  • 您在寻找 Excel VBA 分析器吗?

标签: excel powershell vba


【解决方案1】:

试试:

#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

【讨论】:

  • 谢谢!这对我帮助很大!
【解决方案2】:

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

下面的代码将遍历 A 列中的所有电子邮件地址(从单元格“A2”开始 - 您可以根据需要进行修改),然后它使用 Split 函数来拆分电子邮件地址和域名(进入EmailArr数组)。

然后,确认代表域名的EmailArr(1) 是唯一的,方法是确保它不在Dictionary 中,您可以通过以下代码行实现这一点:If Not Dict.exists(EmailArr(1)) Then --> 就是这样,您有一个只存储唯一域名的字典。

最后,我添加了一个循环来显示MsgBox 中的唯一域名(您可以将它们放在数组或范围中)。

代码

Option Explicit

Sub KeepUniqueDomains()
    Dim Dict As Object
    Dim EmailArr As Variant
    Dim C As Range, LastRow As Long
    Dim Key As Variant

    Set Dict = CreateObject("Scripting.Dictionary")

    With Sheets("Sheet7") '<-- modify "Sheet7" with your sheet's name
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        For Each C In .Range("A2:A" & LastRow).Cells
            EmailArr = Split(C.Value, "@")

            If Not Dict.exists(EmailArr(1)) Then
                Dict.Add EmailArr(1), EmailArr(1)
            End If
        Next C
    End With

    Dim MsgStr As String
    For Each Key In Dict.keys
        MsgStr = MsgStr & Key & vbCr
    Next Key
    MsgBox "Unique domain names in the list are :" & vbCr & MsgStr
End Sub

【讨论】:

    【解决方案3】:

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

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

    听起来您希望每个电子邮件域都有一个唯一的条目。它是哪个条目有关系吗?以下 PowerShell 代码将获得每个域的第一个匹配项(假设您的 CSV 文件的电子邮件地址字段具有“电子邮件地址”的标题:

    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 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2011-09-21
      相关资源
      最近更新 更多