PowerShell 5.1
我将数据表 $dt_1 和 $dt_2 加入到一个新的数据表 $merge 中,代码如下:
$merged = $dt_1 | ForEach-Object {
$dt1Row = $_
$dt2Rows = $dt_2 | Where-Object { $_."Facility" -eq $dt1Row."Facility" -and $_."Customer" -eq $dt1Row."Customer" -and $_."Contract" -eq $dt1Row."Contract" }
$resultObject = $dt1Row | Select-Object "Contract", "Customer ","Contract"
$Count = 1
foreach ($dt2Row in $dt2Rows) {
$resultObject | Add-Member -MemberType NoteProperty -Name ("Material - $Count") -Value $dt2Row.Material
$resultObject | Add-Member -MemberType NoteProperty -Name ("Material_Number - $Count") -Value $dt2Row.'Material_Number'
$Count ++
}
$resultObject
}
$dt_2 对于存储在 $dt1 中的密钥有多个条目:设施、客户、合同。
当我输出 $merged with 时
$merged | Format-Table -AutoSize
在控制台中,我准确地获得了想要导出到 CSV 的视图:
设施 | 客户 | 合同 | 材料 - 1 | 材料编号 - 1 | 材料 - 2 | 材料_编号 - 2 | 材料 - 3 | 材料_编号 - 3 |
---|---|---|---|---|---|---|---|---|
Fac_A | 客户_X | 合同_X | 材质_A | 材料_编号_123 | 材质_B | 材料_编号_234 | 材质_C | 材料_编号_564 |
Fac_A | 客户_Y | 合同_Y | 材料_A | 材料_编号_123 | 材质_B | 材料_编号_234 |
但是如果我通过
将 $merged 导出到 csv$merged | Export-Csv "\Path\To\CSV.csv" -NoType -Delimiter ";" -Encoding UTF8
我只获得 CSV 中最大为 1 的值:
设施 | 客户 | 合同 | 材料 - 1 | 材料编号 - 1 |
---|---|---|---|---|
Fac_A | 客户_X | 合同_X | 材料_A | 材料_编号_123 |
Fac_A | 客户_Y | 合同_Y | 材质_A | 材料_编号_123 |
这是什么原因?我可以强制完全导出到 csv 吗?
正如我在评论中提到的,我猜测您丢失的属性是由于您集合中的第一个项目没有与其他项目一样多的属性。我对您的流程有一个稍微不同的解决方案,但它仍然迭代
$dt_2
,针对 $dt_1
进行验证(看来您正在这样做)。它将事物分组,找到最大的组,然后使用最大组拥有的材料数量为每个分组创建对象(仅在额外的列中具有空值)。
首先,我模拟了与示例中类似的表格。我在第一个表中添加了几个,以包含相同的客户/不同的设施以显示其输出方式,以及表中没有匹配的客户$dt_2
。我还在 $dt_2
中添加了一行,而 $dt_1
中没有匹配项,以表明它像代码一样从输出中排除。
$dt_1=@'
"Facility","Customer","Contract"
"Seattle","Cust_A","C1"
"Chicago","Cust_A","C1"
"Chicago","Cust_B","C2"
"Dallas","Cust_C","C3"
"Dallas","Cust_D","C2"
'@|convertfrom-csv
$dt_2=@'
"Facility","Customer","Contract","Material","Material_Number"
"Seattle","Cust_A","C1","M1","123"
"Chicago","Cust_B","C2","M1","123"
"Seattle","Cust_A","C1","M2","456"
"Dallas","Cust_C","C3","M2","456"
"Dallas","Cust_C","C3","M4","789"
"Chicago","Cust_A","C1","M2","456"
"Chicago","Cust_A","C1","M5","000"
"Seattle","Cust_D","C2","M4","789"
'@|ConvertFrom-Csv
现在我将
$dt_2
分组,找到最大的组,并为所有组制作对象。
$Grouped = $dt_2|where{$dt_1 -match ($_|select "Facility","Customer","Contract")}|group Facility,Custom,Contract
$MaxGroup = $Grouped|measure-object -Maximum -Property Count|% Maximum
$Results = $Grouped|%{
$objOut = $_.Group[0] |Select "Facility", "Customer","Contract"
For($i=0;$i -lt $MaxGroup;$i++){
Add-Member -InputObject $objOut -NotePropertyName "Material - $($i+1)" -NotePropertyValue $_.group[$i].Material
Add-Member -InputObject $objOut -NotePropertyName "Material_Number - $($i+1)" -NotePropertyValue $_.group[$i].Material_Number
}
$objOut
}
这是通过管道传输到
Format-Table
和 ConvertTo-Csv
的结果(您可以使用 Export-Csv
相同的方式写入文件而不是屏幕)
PS C:\Users\TMTech> $Results | Format-Table -AutoSize
Facility Customer Contract Material - 1 Material_Number - 1 Material - 2 Material_Number - 2
-------- -------- -------- ------------ ------------------- ------------ -------------------
Seattle Cust_A C1 M1 123 M2 456
Chicago Cust_B C2 M1 123
Dallas Cust_C C3 M2 456 M4 789
Chicago Cust_A C1 M2 456 M5 000
PS C:\Users\TMTech> $Results | convertto-csv -NoTypeInformation -Delimiter ';'
"Facility";"Customer";"Contract";"Material - 1";"Material_Number - 1";"Material - 2";"Material_Number - 2"
"Seattle";"Cust_A";"C1";"M1";"123";"M2";"456"
"Chicago";"Cust_B";"C2";"M1";"123";;
"Dallas";"Cust_C";"C3";"M2";"456";"M4";"789"
"Chicago";"Cust_A";"C1";"M2";"456";"M5";"000"
请注意,第一个和最后一个结果都是 Cust_A,只是针对不同的设施,显示哪个设施使用了哪些材料。