使用 PowerShell 将不完整的数据表导出到 csv

问题描述 投票:0回答:1

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 吗?

powershell csv join export
1个回答
0
投票

正如我在评论中提到的,我猜测您丢失的属性是由于您集合中的第一个项目没有与其他项目一样多的属性。我对您的流程有一个稍微不同的解决方案,但它仍然迭代

$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,只是针对不同的设施,显示哪个设施使用了哪些材料。

© www.soinside.com 2019 - 2024. All rights reserved.