【问题标题】:Powershell CSV Nested Hash Table / Array LookupsPowershell CSV 嵌套哈希表/数组查找
【发布时间】:2018-10-01 08:06:50
【问题描述】:

我有两个 CSV 文件。 TeamCSV 和 TeamDetailsCSV。请参阅下面的格式。

我想通过使用 TeamCSV(Team, Name, NUMber, Color) 作为基础并在 TeamDetailsCSV(形状和代码)中进行一些查找来输出第三个 CSV(下面的所需输出)。

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

感谢您对此的任何帮助。这几天一直在头疼。非常感谢大家。

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

【问题讨论】:

    标签: arrays powershell csv hashtable


    【解决方案1】:

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

    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
    

    【讨论】:

    • 这也有效。感谢盒狗。我使用了这个和 langstrom 的组合。
    【解决方案2】:

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

    这会从第一个 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
    

    【讨论】:

    • 嗨 langstrom,这行得通。非常感谢。干净直接。我还有 2 个操作要在桌子上执行,但不知道如何执行它。
    【解决方案3】:

    我假设$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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-16
      • 2021-12-10
      • 2017-12-14
      • 1970-01-01
      • 2017-12-11
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多