作者:吴台吉国瑋智仁 | 来源:互联网 | 2023-01-23 11:17
1> BACON..:
@BenH的答案显然是实现此问题的更好方法,但我只是想解释一下原始代码的问题。问题在于,这$data
是HashTable
将string
(用户ID
)映射到数组(实际上是a,Collection
但出于我们的目的,它的行为相同)。即使在ID
'2345'
只有一条匹配记录的情况下,$data
仍将其存储为具有一个元素的数组:
PS> $data['2345'].GetType().Name
Collection`1
PS> $data['2345'].Count
1
PS> $data['2345'] # Returns the array of values
ID : 2345
Value 1 : Moscow
Value 2 : Serial7
Value 3 :
Value 4 : HR Application
PS> $data['2345'][0] # Returns the first element of the array of values
ID : 2345
Value 1 : Moscow
Value 2 : Serial7
Value 3 :
Value 4 : HR Application
因此,当这条线执行时...
$finalValues.Add($data[$user.ID].ID, $data[$user.ID])
...您正在将新项添加到$data
键和值均为数组的位置。这就是为什么管道输出$finalValues
或$finalValues.Values
to的Export-Csv
行为就像值是数组的原因。是因为他们是。
为了解决这个问题,访问其中的项目时,$data
我们需要一个内部循环来“解包”每个值。另外,我们不能使用HashTable
for,$finalValues
因为您使用的ID
是键,但是结果中存在重复的ID
s('1234'
)。由于我们需要的是最终要传递给的平坦记录列表Export-Csv
,因此我们可以仅使用数组。这是一些修改后的代码...
$finalValues = @() # Cannot be a HashTable because there may be multiple results with the same ID
$users = Import-Csv "SEARCH.csv"
$data = Import-Csv "DATA.csv" | Group-Object -property ID -AsHashTable
foreach ($user in $users)
{
If ($data.Contains($user.ID))
{
# "Unwrap" the array stored at $data[$user.ID]
foreach ($dataRecord in $data[$user.ID])
{
$finalValues += $dataRecord
}
}
}
$finalValues | Export-Csv -Path test.csv -NoTypeInformation
...产生这个CSV ...
"ID","Value 1","Value 2","Value 3","Value 4"
"1234","London","Serial1","HP","Laptop User"
"1234","London","Serial9","","Finance Application"
"2345","Moscow","Serial7","","HR Application"