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

如何用CSV中的User id替换JSON内的邮箱?求PowerShell/jq解决方案

问题:将JSON中watchers数组的邮箱替换为CSV对应的User ID

输入文件示例

CSV文件(users.csv)

User id,email
1234-1234-1234,some@email.address
321-1235-44432,anoteher@email.address
322136231345,more.email@address.too

JSON文件(watchers.json)

[
    {
        "externalId": "100000",
        "watchers": ["some@email.address", "anoteher@email.address", "more.email@address.too"]
    },
    {
        "externalId": "100002",
        "watchers": ["anoteher@email.address", "more.email@address.too"]
    }
]

需求说明

需要将JSON中每个条目的watchers数组内的邮箱地址,替换为CSV文件中对应的User id值。

原代码问题

原PowerShell嵌套循环存在两个核心问题:

  1. 效率低下:每次查找邮箱都要遍历整个CSV文件,数据量大时性能差
  2. 仅替换第一个邮箱:直接将$watchersJSONdata.watchers赋值为单个ID,覆盖了整个数组;且-eq比较数组与字符串仅会匹配第一个元素

原代码:

$usersCSV = Import-Csv 'users.csv'
$watchersJSON = Get-Content -Path "watchers.json" -raw |ConvertFrom-Json

foreach ($watchersJSONdata in $watchersJSON) {
    foreach ($usersCSVdata in $usersCSV){
        if ($watchersJSONdata.watchers -eq $usersCSVdata.email) {
            $watchersJSONdata.watchers = $usersCSVdata.'User id'
        }
    }
} $watchersJSON |ConvertTo-Json | out-file  "watchers-with-ID.json"

错误输出结果:

[{
        "externalId": "100000",
        "watchers": ["1234-1234-1234"]
    }
]

解决方案

方案1:优化后的PowerShell代码

通过哈希表映射邮箱与User ID将查找效率从O(n)提升至O(1),同时逐个遍历替换数组元素,解决覆盖问题:

# 构建邮箱到User ID的哈希表,实现快速查找
$emailToUserId = @{}
Import-Csv 'users.csv' | ForEach-Object {
    $emailToUserId[$_.email] = $_.['User id']
}

# 读取并解析JSON文件
$watchersJSON = Get-Content -Path "watchers.json" -Raw | ConvertFrom-Json

# 遍历每个条目,替换watchers数组中的邮箱
foreach ($item in $watchersJSON) {
    $item.watchers = $item.watchers | ForEach-Object {
        # 找到对应ID则替换,未找到则保留原邮箱(可根据需求删除`?? $_`)
        $emailToUserId[$_] ?? $_
    }
}

# 输出处理后的JSON(-Depth 10确保嵌套结构正确序列化)
$watchersJSON | ConvertTo-Json -Depth 10 | Out-File "watchers-with-ID.json"

方案2:jq单命令解决方案

利用jq将CSV转为邮箱映射表,再批量替换JSON中的邮箱:

# 将CSV转为邮箱->User ID的JSON映射,再处理原JSON
jq --slurpfile users <(jq -R 'split(",") | {key: .[1], value: .[0]}' users.csv | jq -s 'from_entries') '
    .[] | .watchers = [.watchers[] | $users[0][.]]
' watchers.json > watchers-with-ID.json

执行后正确输出:

[
    {
        "externalId": "100000",
        "watchers": ["1234-1234-1234", "321-1235-44432", "322136231345"]
    },
    {
        "externalId": "100002",
        "watchers": ["321-1235-44432", "322136231345"]
    }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:57:17