Массив Powershell: вывод дедупликации HOWTO - PullRequest
0 голосов
/ 04 января 2019

Когда я запускаю этот скрипт синтаксического анализатора в файле 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 ]

0 голосов
/ 04 января 2019

Я понял это. Я ОБРАТИТСЯ к переменным $ obj Add-Member *, которые фиксировали порядок), и добавил еще одну строку " $ writeobj = $ true " к совпадению FN, и VOILÀ больше не дублирует. Это странно или как?

#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
0 голосов
/ 04 января 2019

Выберите уникальные объекты.

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

В качестве примечания, вы можете избежать добавления массива в цикл, так как он будет работать плохо. Просто направьте вашу петлю ForEach-Object прямо в Export-Csv.

...