如何用PowerShell合并CSV指定列并重命名表头?原代码失效求解
问题分析与解决方案
你的代码核心问题是合并方式错误,另外需要确认导入CSV时的表头映射是否准确。让我一步步帮你修正:
为什么原有代码不符合预期
你用@($temp1, $temp2)是把两个对象数组纵向拼接(先放所有APP行,再放所有Project行),而不是把两个CSV的对应行横向合并成包含两列的新行。导出后你会看到前半段只有APP列有值,Project列空着;后半段只有Project列有值,APP列空着,这显然不是你想要的结果。
另外要确认:你的ALLdb42APPs.csv每行确实有5个字段,且第五个字段是你需要的Project内容——从示例行来看是匹配的,这部分没问题。
修正后的代码(横向合并两列)
如果你的两个CSV文件行数完全一致,想要把每行的APP和Project对应合并成新的两列CSV,用以下代码:
# 导入第一个CSV,每行1个字段,指定表头为APP $temp1 = Import-Csv "C:\path\APPcsv.csv" -Header "APP" | Select-Object APP # 导入第二个CSV,每行5个字段,指定对应表头并选取Project列 $temp2 = Import-Csv "C:\path\ALLdb42APPs.csv" -Header "NA1", "NA2", "Applications", "NA3", "Project" | Select-Object Project # 遍历两个数组,将对应行的APP和Project合并为新对象 $mergedData = for ($i = 0; $i -lt [Math]::Min($temp1.Count, $temp2.Count); $i++) { [PSCustomObject]@{ APP = $temp1[$i].APP Project = $temp2[$i].Project } } # 导出到新CSV文件 $mergedData | Export-Csv -Path "C:\path\WorkingResult.csv" -NoTypeInformation
关键细节说明
- 合并逻辑:用
for循环遍历两个数组的索引,将对应位置的APP和Project值封装成新的自定义对象,这样每一行都会同时包含两个列的值。 - 行数兼容:用
[Math]::Min($temp1.Count, $temp2.Count)确保不会出现索引越界问题,如果两个CSV行数不一致,会以较短的那个为准。 - 分隔符适配:如果你的CSV不是用逗号分隔(比如制表符),需要给
Import-Csv加上-Delimiter参数,例如-Delimiter "t"`。
内容的提问来源于stack exchange,提问作者Yamez
相关产品推荐
相关产品推荐

