如何使用PowerShell合并列头不同的两个CSV文件并按软件名匹配字段
PowerShell合并不同表头CSV实现方案
实现思路
- 先读取存储软件用户映射的csvf2,将软件名去除前后空格后作为键、用户SID作为值存入哈希表,大幅提升匹配效率
- 遍历存储软件基础信息的csvf1所有条目,以去除空格后的软件名去哈希表中匹配对应SID,匹配失败则填充
null - 仅保留需求指定的5个字段,最终导出为合并后的CSV文件
具体实现代码
# 1. 替换为你的实际文件路径 $csv1Path = "C:\你的路径\csvf1.csv" $csv2Path = "C:\你的路径\csvf2.csv" $outputPath = "C:\你的路径\合并结果.csv" # 2. 构建软件-用户映射哈希表,自动处理csvf2软件名尾部空格问题 $userMapping = @{} Import-Csv -Path $csv2Path -Encoding UTF8 | ForEach-Object { $softKey = $_.softwarename.Trim() $userMapping[$softKey] = $_.User } # 3. 遍历csvf1生成合并结果 $mergedResult = Import-Csv -Path $csv1Path -Encoding UTF8 | ForEach-Object { $currentSoft = $_.softwarename.Trim() $matchUser = $userMapping.ContainsKey($currentSoft) ? $userMapping[$currentSoft] : "null" # 输出指定字段的对象 [PSCustomObject]@{ softwarename = $_.softwarename InstalledDate = $_.InstalledDate hostname = $_.hostname softwarestatus = $_.softwarestatus user = $matchUser } } # 4. 导出结果CSV $mergedResult | Export-Csv -Path $outputPath -Encoding UTF8 -NoTypeInformation
注意事项
- 如果你的CSV文件采用GBK/ANSI编码,将代码中的
-Encoding UTF8替换为-Encoding Default即可正常读取 - 如果希望无匹配时user字段留空而非填充字符串
null,将三元表达式中的"null"替换为$null - 结果完全保留csvf1的所有条目,csvf2中存在但csvf1中没有的软件不会被纳入最终结果,符合需求要求
内容的提问来源于stack exchange,提问作者Chandra Sekhar
相关产品推荐
相关产品推荐

