如何在PowerShell中合并两个DataTable并导出为CSV
PowerShell DataTable 透视合并并导出CSV
现有DataTable结构与数据
$dt_1 数据
包含Facility、Customer、Contract三列,数据如下:
| Facility | Customer | Contract |
|---|---|---|
| A | 123 | C1 |
| B | 234 | C2 |
| C | 567 | C3 |
$dt_2 数据
在$dt_1基础上新增Material列,数据如下:
| Facility | Customer | Contract | Material |
|---|---|---|---|
| A | 123 | C1 | M1 |
| B | 234 | C2 | M1 |
| A | 123 | C1 | M2 |
| C | 567 | C3 | M2 |
| C | 567 | C3 | M4 |
需求说明
按$dt_1中的Facility、Customer、Contract字段分组,每组对应一行结果;将$dt_2中同组的所有Material值转换为横向的Material - 1、Material - 2、Material - 3列,最终将结果导出为CSV文件。
初始代码问题
最初编写的代码执行后$finalResult为空,代码如下:
$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 } $dt1Row | Add-Member -MemberType NoteProperty -Name "Materials" -Value ($dt2Rows | Select-Object -ExpandProperty Material) } # Pivot the data to create the desired output format $finalResult = $merged | ForEach-Object { $entry = $_ $entry | Add-Member -MemberType NoteProperty -Name "Material - 1" -Value ($entry.Materials[0]) $entry | Add-Member -MemberType NoteProperty -Name "Material - 2" -Value ($entry.Materials[1]) $entry | Add-Member -MemberType NoteProperty -Name "Material - 3" -Value ($entry.Materials[2]) }
问题原因:
- 第一个
ForEach-Object块仅对$dt1Row添加属性,但未输出处理后的对象,导致$merged变量为空。 - 第二个
ForEach-Object块同样未返回处理后的对象,最终$finalResult自然为空。
修正后的可行代码
调整后的代码可正确实现需求:遍历$dt_1的每一行,匹配$dt_2中同分组的记录,创建包含原分组字段的新对象,逐个添加横向的Material列并赋值,最后返回该对象。代码如下:
$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 Facility, Customer, Contract $materialCount = 1 foreach ($material in $dt2Rows | Select-Object -ExpandProperty Material) { $resultObject | Add-Member -MemberType NoteProperty -Name ("Material - $materialCount") -Value $material $materialCount++ } $resultObject }
导出CSV
得到$merged结果后,执行以下命令导出为CSV文件:
$merged | Export-Csv -Path "分组结果.csv" -NoTypeInformation
内容的提问来源于stack exchange,提问作者Peter S
相关产品推荐
相关产品推荐

