如何将PowerShell中$d1与$d2变量的列合并输出?
PowerShell合并两个CSV并保留所有列的解决方法
场景1:两个CSV存在关联键(如UID与Email用户标识匹配)
如果两个数据集有可匹配的关联字段(比如$d1的UID对应$d2中Email的前缀,或是$d2也包含UID列),可以用以下方式合并:
方式1:手动遍历匹配(无需额外模块)
# 假设$d1的UID是$d2中Email的用户名前缀(如UID=zhangsan,Email=zhangsan@xxx.com) $d1 | ForEach-Object { $currentUid = $_.UID $matchRow = $d2 | Where-Object { $_.Email -like "$currentUid@*" } # 构造合并后的对象,无匹配项则对应列留空 [PSCustomObject]@{ UID = $currentUid HDate = $_.HDate Email = $matchRow.Email ?? $null Office = $matchRow.Office ?? $null } } | Export-Csv -Path "合并结果.csv" -NoTypeInformation
方式2:用Join-Object模块(适合复杂关联)
# 先安装模块(仅第一次需要) Install-Module -Name JoinModule -Scope CurrentUser -Force # 按UID字段内连接合并,保留所有列 $d1 | Join-Object -JoinType Inner -With $d2 -On UID | Export-Csv -Path "合并结果.csv" -NoTypeInformation
场景2:按行索引一对一合并(无关联键,仅按行顺序匹配)
如果两个CSV行数一致,且只需按行顺序一一对应合并:
for ($i = 0; $i -lt $d1.Count; $i++) { [PSCustomObject]@{ UID = $d1[$i].UID HDate = $d1[$i].HDate Email = if ($i -lt $d2.Count) { $d2[$i].Email } else { $null } Office = if ($i -lt $d2.Count) { $d2[$i].Office } else { $null } } } | Export-Csv -Path "按行合并结果.csv" -NoTypeInformation
注意事项
- 使用
Export-Csv时,-NoTypeInformation参数可避免生成冗余的类型信息行 - 若两个CSV行数不一致,按行合并时超出部分的列会填充
$null - 关联键匹配时,需确保匹配规则符合实际数据格式(如区分大小写、是否包含特殊字符)
内容的提问来源于stack exchange,提问作者CuriousCoder
相关产品推荐
相关产品推荐

