PowerShell - Перечисление через 2 группы CSV с использованием различий foreach и сравнить объект для вывода различий - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно сравнить 2 CSV-файла и вывести различия, содержащиеся в большем, которые отсутствуют в меньшем, на основе 2 заголовков (SiteName, PrimarySMTPAddress).

В настоящее время я могу сделать это с использованием следующего:

#Importing CSV
$File1 = Import-Csv -Path "C:\Data1-Large.csv"

#Importing CSV 
$File2 = Import-Csv -Path "Data2.csv"

#Compare both CSV files - column PrimarySMTPAddress
$Results = Compare-Object  $File1 $File2 -Property PrimarySMTPAddress -IncludeEqual

$Array = @()       
Foreach($R in $Results)
{
    If( $R.sideindicator -eq "==" )
    {
        $Object = [pscustomobject][ordered] @{

            PrimarySMTPAddress = $R.PrimarySMTPAddress
            "Compare indicator" = $R.sideindicator

        }
        $Array += $Object
    }
}

#Count users in both files
($Array | sort-object username | Select-Object * -Unique).count

#Display results in console
$Array

Проблема с вышесказанным заключается в том, что он покажет различия между большим CSV и маленьким CSV - он выплюнет ВСЕ первичные адреса SMTP в большом CSV.

Мне нужно получить выходные данные для фильтрации по 2-му столбцу SiteName, чтобы были перечислены только имена SiteNames, которые соответствуют другим CSV (большой CSV содержит 12000 ROWS против 2500 в маленьком). Фильтрация с Compare-Object - это не то же самое, я не вижу, как использовать Where-Object для фильтрации, как обычно.

Я новичок в Массивах, поэтому буду признателен за любую помощь.

Заранее спасибо.

1 Ответ

0 голосов
/ 27 февраля 2020

Вы можете сделать следующее, если у вас есть настоящие CSV-файлы с заголовками столбцов.

$DataSet1 = Import-Csv C:\provisioningdata\Provision-P3-D
$DataSet2 = Import-Csv C:\provisioningdata\Provision-P3
Compare-Object $DataSet1 $DataSet2 -Property PrimarySmtpAddress | 
     Where SideIndicator -eq '=>' |
         Select-Object @{n='Username';e={$_.PrimarySmtpAddress}}

Что касается параллельного обхода через два массива, использовать for l oop проще всего. Однако вы действительно полагаетесь на то, что порядок ваших данных предсказуем.

for ($i = 0; $i -lt $DataSet2.Count; $i++) {
    Compare-Object $DataSet1[$i] $DataSet2[$i] -Property PrimarySmtpAddress | 
         Where SideIndicator -eq '=>' |
             Select-Object @{n='Username';e={$_.PrimarySmtpAddress}}
}

EDIT

Я не уверен, почему существует необходимость обхода по сайту, когда Compare-Object поддерживает несколько свойств и выражений, но вы можете сделать следующее:

$File1 = Import-Csv -Path "C:\Data1-Large.csv"
$File2 = Import-Csv -Path "Data2.csv"

$SiteGroup1 = $File1 | Group-Object -Property {$_.SiteName -replace '(?<=^.{7}).*'}
$SiteGroup2 = $File2 | Group-Object -Property {$_.SiteName -replace '(?<=^.{7}).*'}

$Results = foreach ($site in $SiteGroup2) {
    Compare-Object $SiteGroup1.Where{$_.Name -eq $site.Name}.Group $site.Group -Property PrimarySmtpAddress
}

Использование Compare-Object с несколькими свойствами и выражениями:

Compare-Object $File1 $File2 -Property PrimarySMTPAddress,{$_.SiteName -replace '(?<=^.{7}).*'}
...