0

我需要比较 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 之间的差异 - 它会吐出大 CSV 中的所有主 SMTP 地址。

我需要让输出在第二列站点名称上进行过滤,以便仅枚举与其他 CSV 匹配的站点名称(大 CSV 包含 12000 行,而小 CSV 包含 2500 行)。过滤Compare-Object不一样,我看不到如何Where-Object像往常一样使用过滤。

我是 Arrays 的新手,所以,如果有任何帮助,我将不胜感激。

提前致谢。

4

1 回答 1

0

如果您有带有列标题的真实 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循环是最简单的。但是,您确实依赖于可预测的数据顺序。

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}}
}

编辑

我不确定为什么在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}).*'}
于 2020-02-27T10:08:35.237 回答