我有一个解决方案,但我认为这不是最好的方法,因为它需要很长时间,所以我正在寻找一种更快/更好/更智能的方法。
我有多个从 .csv 文件中提取的 pscustomObject 对象。每个对象至少有一个共同属性。一个相对较小(对象中大约 200-300 个项目/行),但另一个相当大(大约 60,000-100,000 个项目)。一个的内容可能与另一个的内容匹配,也可能不匹配。
我需要找到两个对象在特定属性上匹配的位置,然后将每个对象的属性组合成一个具有全部或大部分属性的对象。
示例代码片段(不准确,但就此而言它应该有效 - 请参见示例数据的图像): DataTables
Write-Verbose "Pulling basic Fruit data together"
$Purchase = import-csv "C:\Purchase.csv"
$Selling = import-csv "C:\Selling.csv"
Write-Verbose "Combining Fruit names and removing duplicates"
$Fruits = $Purchase.Fruit
$Fruits += $Selling.Fruit
$Fruits = $Fruits | Sort-Object -Unique
$compareData = @()
Foreach ($Fruit in $Fruits) {
$IndResults = @()
$IndResults = [pscustomobject]@{
#Adding Purchase and Selling data
Farmer = $Purchase.Where({$PSItem.Fruit -eq $Fruit}).Farmer
Region = $Purchase.Where({$PSItem.Fruit -eq $Fruit}).Region
Water = $Purchase.Where({$PSItem.Fruit -eq $Fruit}).Water
Market = $Selling.Where({$PSItem.Fruit -eq $Fruit}).Market
Cost = $Selling.Where({$PSItem.Fruit -eq $Fruit}).Cost
Tax = $Selling.Where({$PSItem.Fruit -eq $Fruit}).Tax
}
Write-Verbose "Loading Individual results into response"
$CompareData += $IndResults
}
Write-Output $CompareData
我认为问题出在如下几行:
Farmer = $Purchase.Where({$PSItem.Fruit -eq $Fruit}).Farmer
如果我理解这一点,它会在每次通过此行时查看 $Purchase 对象。我正在寻找一种方法来加快整个过程,而不是让它在每次匹配尝试时都查看整个对象。
最佳答案
使用这个 Join-Object
:
$Purchase | Join $Selling -On Fruit | Format-Table
结果(使用 Simon Catlin 的数据):
Fruit Farmer Region Water Market Cost Tax
----- ------ ------ ----- ------ ---- ---
Apple Adam Alabama 1 MarketA 10 0.1
Cherry Charlie Cincinnati 2 MarketC 20 0.2
Damson Daniel Derby 3 MarketD 30 0.3
Elderberry Emma Eastbourne 4 MarketE 40 0.4
Fig Freda Florida 5 MarketF 50 0.5
关于arrays - Powershell 匹配属性,然后有选择地组合对象以创建第三个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41861240/