-1

我正在尝试在 PowerShell 中为特定用例实现数据结构,其中数据以以下格式存储在 CSV 文件中

MappingName,Param1,Val1,Param2,Val2,Param3,Val3,Param4,Val4
map1,p11,v11,p12,v12,p13,v13,,
map2,p21,v21,p22,v22,,,,
map3,p31,v31,p32,v32,p33,v33,p34,v34

我需要解析 csv 以获得具有映射名称和参数集作为键值的复合哈希图。还需要访问所有参数的单个键值对。

我已经在 java 中成功地实现了这一点,但不确定如何在 PowerShell 中解决这个问题。

4

1 回答 1

1

这是你在想的吗?它将遍历每一行的属性,对这些对进行分组,如果有值则将它们添加到哈希表中。

$data = @"
MappingName,Param1,Val1,Param2,Val2,Param3,Val3,Param4,Val4
map1,p11,v11,p12,v12,p13,v13,,
map2,p21,v21,p22,v22,,,,
map3,p31,v31,p32,v32,,,p34,v34
"@ | ConvertFrom-Csv

#$data = Import-CSV -Path "mycsv.csv"

$out = @()

$data | ForEach-Object { 

    #Hashtable for the parameters
    $ht = @{}

    #List properties
    $_.psobject.Properties |
    #Get only the grouped properties (that have a number at the end)
    Where-Object { $_.Name -match '\d+$' } |
    #Group properties by param/group number
    Group-Object {$_.Name -replace '\D+(\d+)$', '$1' } | ForEach-Object {
        $param = $_.Group | Where-Object { $_.Name -match 'param' }
        $value = $_.Group | Where-Object { $_.Name -match 'val' }

        #If property has value
        if($value.value -ne ""){
            #Add to hashtable
            $ht.add($param.Value,$value.Value)
        }
    }

    $ht.add("MappingName",$_.MappingName)

    $out += $ht
}


$out

Name                           Value
----                           -----
p13                            v13
p11                            v11
p12                            v12
MappingName                    map1
p21                            v21
p22                            v22
MappingName                    map2
p32                            v32
p34                            v34
MappingName                    map3
p31                            v31



$out[0]

Name                           Value
----                           -----
p13                            v13
p11                            v11
p12                            v12
MappingName                    map1

就我个人而言,我会将哈希表存储在一个主哈希表中,该哈希表将使用MappingName作为键和参数的哈希表作为值。前任:

$data = @"
MappingName,Param1,Val1,Param2,Val2,Param3,Val3,Param4,Val4
map1,p11,v11,p12,v12,p13,v13,,
map2,p21,v21,p22,v22,,,,
map3,p31,v31,p32,v32,,,p34,v34
"@ | ConvertFrom-Csv

#$data = Import-CSV -Path "mycsv.csv"

$out = @{}

$data | ForEach-Object { 

    #Hashtable for the parameters
    $ht = @{}

    #List properties
    $_.psobject.Properties |
    #Get only the grouped properties (that have a number at the end)
    Where-Object { $_.Name -match '\d+$' } |
    #Group properties by param/group number
    Group-Object {$_.Name -replace '\D+(\d+)$', '$1' } | ForEach-Object {
        $param = $_.Group | Where-Object { $_.Name -match 'param' }
        $value = $_.Group | Where-Object { $_.Name -match 'val' }

        #If property has value
        if($value.value -ne ""){
            #Add to hashtable
            $ht.add($param.Value,$value.Value)
        }
    }

    $out.add($_.MappingName,$ht)
}

$out

Name                           Value
----                           -----
map2                           {p21, p22}
map1                           {p13, p11, p12}
map3                           {p32, p34, p31}



PS C:\Users\frode> $out["map2"]

Name                           Value
----                           -----
p21                            v21
p22                            v22
于 2016-03-12T15:27:38.460 回答