我对此有一个解决方案,但我相信这不是最好的方法,因为它需要永远,所以我正在寻找更快/更好/更智能的方法。
我有多个从 .csv 文件中提取的 pscustomObject 对象。每个对象至少有一个共同属性。一个相对较小(对象中大约 200-300 个项目/行),但另一个相当大(大约 60,000-100,000 个项目)。一个的内容可能与另一个的内容匹配,也可能不匹配。
我需要找到两个对象在特定属性上匹配的位置,然后将每个对象的属性组合成一个具有全部或大多数属性的对象。
代码示例片段(不准确,但它应该可以工作 - 请参阅示例数据的图像):数据表 https://i.stack.imgur.com/zWjNw.jpg
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 https://www.powershellgallery.com/packages/Join:
$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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)