You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:55:29