使用 csv 文件中的数据在 PowerShell 中组合数组和哈希表
Combine Arrays and Hash Tables in PowerShell using data from csv file
我正在尝试在 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 中解决这个问题。
这是你的想法吗?它将遍历每一行的属性,对这些对进行分组,如果有值,则将它们添加到哈希表中。
$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+)$', '' } | 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+)$', '' } | 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
我正在尝试在 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 中解决这个问题。
这是你的想法吗?它将遍历每一行的属性,对这些对进行分组,如果有值,则将它们添加到哈希表中。
$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+)$', '' } | 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+)$', '' } | 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