PowerShell合并CSV脚本问题:无匹配时如何保留原记录?
解决PowerShell CSV合并时无匹配记录不写入的问题
你的问题核心是只有匹配到HR记录时才执行写入操作,没找到匹配的用户就直接跳过了。要实现无匹配也写入原始记录,只需调整逻辑:先为每个用户创建包含完整字段的基础对象,再尝试匹配HR数据更新Company字段,最后不管有没有匹配都把对象写入结果文件。
修改后的脚本
# 导入两个CSV文件 $hrUsers = Import-Csv -Path "C:\temp\HR.csv" $combinedUsers = Import-Csv "C:\temp\combined.csv" # 创建空数组存储所有合并后的结果对象 $results = @() foreach ($user in $combinedUsers) { # 初始化基础对象,先填充combined.csv的所有字段,Company默认留空 $obj = [PSCustomObject]@{ "First Name" = $user.'First Name' "Last Name" = $user.'Last Name' "Enrollment Date" = $user.'Enrollment Date' "Due Date" = $user.'Due Date' "Status" = $user.'Status' "Email Address" = $user.'Email Address' "Manager" = $user.'Manager' "Company" = $null # 无匹配时保持空值 } # 遍历HR数据查找匹配项 foreach ($hr in $hrUsers) { if ($hr.'Last Name' -eq $user.'Last Name' -and $hr.'First Name' -eq $user.'First Name') { # 找到匹配就更新Company字段 $obj.Company = $hr.'Company' # 找到匹配后退出内层循环,避免重复查找 break } } # 无论是否匹配,都将对象加入结果数组 $results += $obj } # 一次性导出所有结果到CSV,比循环Append效率更高 $results | Export-Csv -Path "C:\temp\experiment2.csv" -NoTypeInformation
关键改动说明
- 先构建完整基础对象:每个用户先创建包含所有必填字段的对象,
Company默认设为空,保证即使无匹配也有符合要求的结构。 - 匹配后仅更新目标字段:找到HR匹配项时只修改
Company,不用重复赋值其他字段,简化代码逻辑。 - 统一收集再导出:先用数组存储所有结果,最后一次性导出,比循环调用
Export-Csv -Append效率高很多,尤其适合数据量较大的场景。 - 提前终止内层循环:找到匹配后用
break跳出HR遍历,减少不必要的循环次数。
可选性能优化(适用于大数据量)
如果HR数据条目较多,可以先将其转换为哈希表,用姓氏+名字作为键,大幅提升匹配查找速度:
# 将HR数据转换为哈希表,键格式为"LastName_FirstName" $hrHash = @{} foreach ($hr in $hrUsers) { $key = "$($hr.'Last Name')_$($hr.'First Name')" $hrHash[$key] = $hr.'Company' } $results = @() foreach ($user in $combinedUsers) { $key = "$($user.'Last Name')_$($user.'First Name')" # 直接从哈希表中获取Company,无匹配则返回空值 $company = $hrHash[$key] $obj = [PSCustomObject]@{ "First Name" = $user.'First Name' "Last Name" = $user.'Last Name' "Enrollment Date" = $user.'Enrollment Date' "Due Date" = $user.'Due Date' "Status" = $user.'Status' "Email Address" = $user.'Email Address' "Manager" = $user.'Manager' "Company" = $company } $results += $obj } $results | Export-Csv -Path "C:\temp\experiment2.csv" -NoTypeInformation
内容的提问来源于stack exchange,提问作者Section8Network
相关产品推荐
相关产品推荐

