PowerShell导入CSV后查找匹配值并更新关联对象ID的实现方法
PowerShell 批量填充同名人员ID解决方案
实现思路
原有嵌套循环方案不仅效率低,还需要手动定位字段索引,容易出错。我们可以利用表结构的固定规则(所有*Name字段对应前缀完全相同的*ID字段),分两步实现需求:
- 全局遍历所有行的所有名称字段,收集所有不重复的人名,给每个名字分配唯一ID,存入映射表
- 二次遍历所有行,根据映射表给对应ID字段赋值,同一个人名不管出现在哪个位置都会分配相同ID
完整代码
# 1. 导入CSV文件 $csvData = Import-Csv ".\import.csv" -Encoding UTF8 # 2. 自动识别所有名称字段与对应ID字段的配对,无需手动列150个字段 $fieldMapping = $csvData[0].PSObject.Properties.Name | Where-Object { $_ -like "*Name" } | ForEach-Object { [PSCustomObject]@{ NameColumn = $_ IdColumn = $_ -replace "Name$", "ID" } } # 3. 建立人名-ID映射表,全局分配唯一ID $nameIdMap = @{} $nextId = 1 foreach ($row in $csvData) { foreach ($map in $fieldMapping) { $currentName = $row.$($map.NameColumn) # 跳过空值,未收录的人名分配新ID if (-not [string]::IsNullOrWhiteSpace($currentName) -and -not $nameIdMap.ContainsKey($currentName)) { $nameIdMap[$currentName] = $nextId++ } } } # 4. 批量回填所有ID字段 foreach ($row in $csvData) { foreach ($map in $fieldMapping) { $currentName = $row.$($map.NameColumn) if (-not [string]::IsNullOrWhiteSpace($currentName)) { $row.$($map.IdColumn) = $nameIdMap[$currentName] } } } # 5. 导出处理后的CSV $csvData | Export-Csv ".\output.csv" -Encoding UTF8 -NoTypeInformation
适配说明
- 如果你的CSV中名称字段后缀是荷兰语
Naam,将代码中*Name和"Name$"两处的Name替换为Naam即可 - 如果CSV编码为GBK,将
Encoding UTF8修改为Encoding Default
内容的提问来源于stack exchange,提问作者Hans Vindevoghel
相关产品推荐
相关产品推荐

