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

如何用For Loop修改PowerShell脚本,仅当邮箱重复时追加location_id?

问题解决:仅在邮箱重复时添加location_id到邮箱地址

现有file.csv内容

id,location_id,name,title,email,directorate
1,1,Amy Lee,Singer,,, 
2,2,brad Pitt,Actor,bpitt@example.com,Production 
3,5,steven spielberg,Producer,Screenwriter, spielberg@example.com,Production
4,8,Andy lee,Comedian,,Radio

原PowerShell脚本

$inputFile = Import-Csv -Path $filePath
$text = (Get-Culture).TextInfo

foreach ($line in $inputFile) {
    $name = $line.name
    $line.name = $text.ToTitleCase($name)
    $firstName = $line.name.split(" ")[0]
    $lastName = $line.name.split(" ")[1]
    $line.email = ($firstName[0] + $lastName + $line.location_id + "@abc.com").toLower()
} 

$inputFile | Export-Csv $fullPath

需求说明

仅当生成的邮箱地址重复时,才在邮箱中追加location_id,参考示例输出:

id,location_id,name,title,email,directorate
1,1, Amy Lee,Singer,alee1@example.com,, 
2,2,Brad Pitt,Actor,bpitt@example.com,Production 
3,5,Steven Spielberg,Producer,Screenwriter,sspielberg@example.com,Production
4,8,Andy Lee,Comedian,alee8@example.com,Radio

解决方案(使用For循环实现)

要实现需求,需分三步处理:先生成基础邮箱(不带location_id)、统计重复情况、再根据重复状态生成最终邮箱。具体脚本如下:

$inputFile = Import-Csv -Path $filePath
$text = (Get-Culture).TextInfo

# 第一步:统一姓名格式,生成基础邮箱(不带location_id)并暂存
foreach ($line in $inputFile) {
    $line.name = $text.ToTitleCase($line.name.Trim())
    $firstName = $line.name.Split(" ")[0]
    $lastName = $line.name.Split(" ")[1]
    # 新增临时属性存储基础邮箱
    $line | Add-Member -MemberType NoteProperty -Name "BaseEmail" -Value ($firstName[0] + $lastName + "@example.com").ToLower() -Force
}

# 第二步:统计每个基础邮箱的重复次数,存入哈希表快速查询
$emailCounts = $inputFile | Group-Object -Property BaseEmail -AsHashTable -AsString

# 第三步:用For循环遍历,根据重复情况生成最终邮箱
for ($i = 0; $i -lt $inputFile.Count; $i++) {
    $line = $inputFile[$i]
    # 原CSV已有邮箱的,直接保留原内容
    if (-not [string]::IsNullOrWhiteSpace($line.email)) {
        continue
    }
    # 检查基础邮箱是否重复
    if ($emailCounts[$line.BaseEmail] -gt 1) {
        # 重复则在邮箱前缀后追加location_id
        $prefix = $line.BaseEmail.Split("@")[0]
        $domain = $line.BaseEmail.Split("@")[1]
        $line.email = ($prefix + $line.location_id + "@" + $domain).ToLower()
    } else {
        # 不重复则直接使用基础邮箱
        $line.email = $line.BaseEmail
    }
    # 移除临时属性,避免导出到CSV中
    $line.PSObject.Properties.Remove("BaseEmail")
}

# 导出处理后的结果
$inputFile | Export-Csv -Path $fullPath -NoTypeInformation

代码说明

  • 第一步先统一姓名的标题格式,同时生成不带location_id的基础邮箱,用临时属性BaseEmail暂存,避免重复计算。
  • 第二步用Group-Object统计每个基础邮箱的出现次数,哈希表结构能快速判断某邮箱是否重复。
  • 第三步用For循环逐行处理:
    • 原CSV已有邮箱的行(如示例中第2、3行)直接跳过,保留原数据;
    • 若基础邮箱重复,就在邮箱前缀后追加location_id;不重复则直接使用基础邮箱;
    • 最后移除临时属性,保证导出的CSV结构干净。

内容的提问来源于stack exchange,提问作者Art

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:20:42