不使用-Co​​mpare比较两个数组

时间:2018-12-19 20:48:44

标签: powershell csv formatting match

我有两个数组,一个包含读入CSV文件中的多个列,另一个仅包含服务器名称,都键入字符串。为了进行比较,我计划仅使用CSV文件中的名称列。我不想使用-compare,因为我仍然希望将所有CSV列与结果一起使用。这是每个数组中数据的示例。

csvFile.Name:

linu40944
windo2094
windo4556

compareFile:

linu40944
windo2094
linu24455

如您所见,它们包含相似的服务器名称,除了$csvFile.Name包含25,000多条记录,而$compareFile仅包含3500条记录。

我尝试过:

foreach ($server in $compareFile) {
    if ($csvFile.Name -like $server) {
        $count++
    }
}

每次运行此命令时,它都要花很长时间才能运行,并且导致$count的价值在几百万,而应该大约是3,000。我尝试了-match-eq等不同的变体。另外请注意,我的最终目标是在-like所在的位置做其他事情,但是现在我只是在尝试确保它输出的是应有的,而不是应有的。

我在这里做错什么了吗?我使用的格式错误吗?

2 个答案:

答案 0 :(得分:2)

鉴于数据量,一个可能的想法。

为第一个/较大文件中的每个名称创建一个哈希表(字典)。名称是关键。每个值都是0。

对于第二个/较小/比较文件中的每个名称,如果哈希表中的值存在,则将其添加1。如果不存在,您的计划是什么?

此后,您可以转储所有键和值,并查看哪些键是0、1或> 1,这些键和值可能对您没有价值。

如果您需要有关此代码的帮助,我也许可以编辑我的答案。由于您是新手,所以对于StackOverflow,也许您想先尝试一下。

答案 1 :(得分:0)

$compareFile构建自定义对象(以便您可以比较相同的属性),然后将Compare-Object与参数-PassThru进行比较。使用SideIndicator区分结果。

$ref = $compareFile | ForEach-Object {
    New-Object -Type PSObject -Property @{
        'Name' = $_
    }
}

Compare-Object $csvFile $ref -Property Name -PassThru | Where-Object {
    $_.SideIndicator -eq '<='
} | Select-Object -Property * -Exclude SideIndicator

结尾的Select-Object删除了SideIndicator添加到结果中的附加属性Compare-Object