Powershell CSV 嵌套哈希 Table / 数组查找

Powershell CSV Nested Hash Table / Array Lookups

我有两个 CSV 文件。团队 CSV 和团队详细信息 CSV。请参阅下面的格式。

我想通过使用 TeamCSV(团队、名称、编号、颜色)作为基础并在 TeamDetailsCSV(形状和代码)中进行一些查找来输出第三个 CSV(下面的所需输出)。

但是,团队 A 和团队 E 组合在一个数组中(请参阅下面的 BadOutputCSV)。我想按照 DesiredOutputCSV 中的描述逐行导出 thirdCSV。我在下面发布了我的代码。

感谢对此的任何帮助。几天来一直在破解我的头。非常感谢大家。

PS C:\temp1> $TeamCSV

Team   Name  Number Color
----   ----  ------ -----
Team A John  1      Blue 
Team A Mary  2      Blue 
Team A James 5      Red  
Team B Mark  5      Red  
Team C Joey  3      Green
Team D Amy   3      Green
Team E Rose  4      Green
Team E Janet 2      Red 

PS C:\temp1> $TeamDetailCSV

Team   Shape    Code
----   -----    ----
Team A Circle   TC01
Team B Square   TC01
Team C Triangle TC01
Team D Hexagon  TC02
Team E Pentagon TC03

PS C:\temp1> $DesiredOutput | ft

Team   Name  Number Color Shape    Code
----   ----  ------ ----- -----    ----
Team A John  1      Blue  Circle   TC01
Team A Mary  2      Blue  Circle   TC01
Team A James 5      Red   Circle   TC01
Team B Mark  5      Red   Square   TC01
Team C Joey  3      Green Triangle TC01
Team D Amy   3      Green Hexagon  TC02
Team E Rose  4      Green Pentagon TC03
Team E Janet 2      Red   Pentagon TC03

PS C:\temp1> $BadOutput | ft

Team            Name            Number          Color           Shape    Code
----            ----            ------          -----           -----    ----
System.Object[] System.Object[] System.Object[] System.Object[] Circle   TC01
Team B          Mark            5               Red             Square   TC01
Team C          Joey            3               Green           Triangle TC01
Team D          Amy             3               Green           Hexagon  TC02
System.Object[] System.Object[] System.Object[] System.Object[] Pentagon TC03

这是我的代码

    $TeamCSV = Import-Csv .\Team-conv.csv
    $TeamDetailCSV = Import-Csv .\TeamDetail-conv.csv



    $TeaminBoth = Compare-Object -ReferenceObject $TeamCSV.Team -DifferenceObject $TeamDetailCSV.team -IncludeEqual | #Posh v3
    Where-Object {$_.SideIndicator -eq "=="} |
    Select-Object -ExpandProperty InputObject 

    $OutputCSV = ForEach($Team in $TeaminBoth) {
        $columnTeamCSV = $TeaminBoth | Where-Object {$_.Team -eq $Team}
        $columnTeamDetailCSV = $TeaminBoth | Where-Object {$_.Team -eq $Team}

           [PSCustomObject][Ordered] @{


                Team = $columnTeamCSV.Team
                Name = $columnTeamCSV.Name
                Number = $columnTeamCSV.Number
                Color = $columnTeamCSV.Color
                Shape = $columnTeamDetailCSV.Shape
                Code = $columnTeamDetailCSV.Code
            }



$OutputCSV | Export-CSV -NoTypeInformation -Path $xlsxPath\teamdetails.csv

这对我有用。这使用数据表,可能不是您要找的东西,但如果您需要进一步扩展它,至少应该对您有所帮助。本质上,您是在对这两个表进行联接。

这会添加第一个 csv 中的项目,然后从第二个 csv 中更新它们。

$TeamCSV = Import-Csv .\Team-conv.csv
$TeamDetailCSV = Import-Csv .\TeamDetail-conv.csv

$TeamDT = New-Object System.Data.DataTable

$TeamDT.Columns.Add("Team")
$TeamDT.Columns.Add("Name")
$TeamDT.Columns.Add("Number")
$TeamDT.Columns.Add("Color")
$TeamDT.Columns.Add("Shape")
$TeamDT.Columns.Add("Code")

foreach ($line in $TeamCSV)
{
    $TeamDT.Rows.Add($line.Team,$line.Name,$line.Number,$line.Color)
}

foreach ($line in $TeamDetailCSV)
{
    $TeamDT.Where({$_.Team -eq $line.Team}) | foreach {$_.Shape = $line.Shape;$_.Code = $line.Code}
}

$TeamDT | ft

这是使用哈希表的一种方法:

Import-Csv .\TeamDetail.csv |
    ForEach-Object {$teamLookup=@{}}{
        $teamLookup[$_.Team] = $_
    }

Import-Csv .\Team.csv |
    ForEach-Object {
        $_ | Add-Member -MemberType NoteProperty -Name Shape -Value $teamLookup[$_.Team].Shape -PassThru |
                Add-Member -MemberType NoteProperty -Name Code -Value $teamLookup[$_.Team].Code -PassThru
    } | Export-csv .\DesiredOutput.csv

如果您导入 DesiredOutput.csv,您将得到:

Team   Name  Number Color Shape    Code
----   ----  ------ ----- -----    ----
Team A John  1      Blue  Circle   TC01
Team A Mary  2      Blue  Circle   TC01
Team A James 5      Red   Circle   TC01
Team B Mark  5      Red   Square   TC01
Team C Joey  3      Green Triangle TC01
Team D Amy   3      Green Hexagon  TC02
Team E Rose  4      Green Pentagon TC03
Team E Janet 2      Red   Pentagon TC03

我假设 $TeamDetailCSV 中每个团队只有一个记录并且没有重复的团队。我还假设您只想在两个文件中都有有效团队时输出。

在那种情况下,我会像这样使用哈希表并为新字段耦合计算属性:

$TeamDetailCSV = Import-Csv .\TeamDetail-conv.csv

# Load the team information into a hash table for easy lookups
$TeamDetailHT = @{}
foreach ($Team in $TeamDetailCSV) {
    $TeamDetailHT.Add($Team.Name, $Team)
}

# Import the team member data, but ignore any data for team members that aren't for valid Teams
Import-Csv .\Team-conv.csv |
    Where-Object { $TeamDetailHT.ContainsKey($_.Team) } |
    Select-Object -Property Team, Name, Number, Color, @{n = 'Shape'; e = {$TeamDetailHT[$_.Team].Shape}}, @{n = 'Code'; e = {$TeamDetailHT[$_.Team].Code}} |
    Export-Csv -NoTypeInformation -Path $xlsxPath\teamdetails.csv