arrays - Powershell 匹配属性,然后有选择地组合对象以创建第三个对象

标签 arrays powershell object

我有一个解决方案,但我认为这不是最好的方法,因为它需要很长时间,所以我正在寻找一种更快/更好/更智能的方法。

我有多个从 .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/

相关文章:

powershell - MSDeploy setParamFile 无法识别参数

javascript - 将对象推送到数组时,新行会附加在末尾

python - 根据两个不同数组的值填充 Numpy 数组

javascript - 是否有任何简写方法将以标题作为第一个数组的字符串数组转换为数组对象?

javascript - 从 Javascript 数组中删除多个对象中途中断

ruby - 如何在 Ruby 中合并哈希数组的内容(键和内容)

powershell - 使用 PowerShell 查找并替换二进制文件中的十六进制值

sqlite - 使用 PowerShell 和 System.Data.SQLite 打开 Firefox 文件 'places.sqlite'

javascript - 键数组,在 json 对象中查找值

typescript - 如何使用 TypeScript 将大对象映射到较小的界面?