如何用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嵌套循环存在两个核心问题:
- 效率低下:每次查找邮箱都要遍历整个CSV文件,数据量大时性能差
- 仅替换第一个邮箱:直接将
$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
相关产品推荐
相关产品推荐

