代码之家  ›  专栏  ›  技术社区  ›  Patrick Burwell

Powershell阵列:如何进行重复数据消除输出

  •  0
  • Patrick Burwell  · 技术社区  · 7 年前

    当我在contacts.xml上运行这个解析器脚本时(它显示每个用户一行),我得到了相同数据的多个实例。我只想为相同的数据创建一个条目。如何在数据写入CSV之前消除重复数据?

    #https://stackoverflow.com/questions/29999682/powershell-parsing-a-text-file
    $input = Get-Content $env:USERPROFILE\Downloads\contacts.xml\Downloads\contacts.xml
    $array = @()
    $input | % {
        $writeobj = $false
        $obj = New-Object System.Object
        if ($_ -match 'email*') {
            $Email = ($_ -split ':')[1]
        }
        if ($_ -match 'FN*') {
            $NAME = ($_ -split ':')[1]
            $writeobj = $true
        }
        if ($writeobj) {
            $obj | Add-Member -Type NoteProperty -Name Email -Value $Email
            $obj | Add-Member -Type NoteProperty -Name Name -Value $NAME
            $array += $obj
        }
        Write-Host $Name, $email
    }
    $array | Export-Csv -Path C:\scripts\reports\test.csv -NoTypeInformation
    

    我希望这会产生单个条目,但我会得到重复的条目(而且它们也排列不正确)。 (是的,我检查了XML文件中的单个条目)

    2 回复  |  直到 7 年前
        1
  •  0
  •   Ansgar Wiechers    7 年前

    Select 唯一的对象。

    $array |
        Select-Object -Property * -Unique |
        Export-Csv -Path 'C:\scripts\reports\test.csv' -NoType
    

    作为补充说明,您可能希望避免在循环中附加到数组,因为这样做的性能肯定很差。管好你的 ForEach-Object Export-Csv

        2
  •  0
  •   mklement0    7 年前

    我想出来了。 $writeobj=$true “跟FN比赛,看,别再被骗了。 是不是很奇怪?

    #https://stackoverflow.com/questions/29999682/powershell-parsing-a-text-file
    $input = Get-Content $env:USERPROFILE\Downloads\contacts.xml $array =
    @() $input | % {
        $writeobj = $false
        $obj = New-Object System.Object
        If ($_ -match 'email') {
            $Email = ($_ -split ':')[1]
            $writeobj = $true
        }
        If ($_ -match 'FN') {
            $NAME = ($_ -split ':')[1]
            $writeobj = $true # <-- right here
        }
        If ($writeobj){
            $obj | Add-Member -type NoteProperty -name Email -value **$NAME**
            $obj | Add-Member -type NoteProperty -name Name -value **$Email**
            $array += $obj
        }
        Write-Host $Name, $email } $array | Export-Csv -path C:\scripts\reports\test.csv -NoTypeInformation