我有两个数组,一个包含读入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
所在的位置做其他事情,但是现在我只是在尝试确保它输出的是应有的,而不是应有的。
我在这里做错什么了吗?我使用的格式错误吗?
答案 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
。