PowerShell对比不同列名CSV指定列生成C.csv的脚本修复咨询
问题修复说明
原脚本存在匹配逻辑错误、语法使用错误、空值风险等问题,以下是可直接运行的修正版本,功能为筛选B.csv中存在但A.csv中不存在的Jobstream记录,生成和A.csv格式一致的C.csv文件。
修正后的完整脚本
# 读取A.csv的所有Name值,存入哈希集合提升查询效率 $aNames = @{} Import-Csv (Join-Path $env:USERPROFILE "Desktop\A.csv") -Delimiter ',' | ForEach-Object { $aNames[$_.Name] = $true } # 读取B.csv全量数据 $bCsv = Import-Csv (Join-Path $env:USERPROFILE "Archi\B.csv") -Delimiter ',' $output = @() # 遍历B.csv所有行,筛选不在A中的记录 foreach ($row in $bCsv) { $jobstream = $row.Jobstream.Trim() # 跳过A中已存在的Name if ($aNames.ContainsKey($jobstream)) { continue } # 同个Jobstream默认只保留一条记录,需要保留全部关联Job的话可以注释掉下面3行 if ($output.Name -contains $jobstream) { continue } # 根据命名规则设置Type $type = if ($jobstream -match '[-_]') { "TechnologyInteraction" } else { "TechnologyService" } # 构造输出对象 $output += [PSCustomObject]@{ ID = [guid]::NewGuid().ToString() Type = $type Name = $jobstream Documentation = $row."Job Description" } } # 确保输出文件夹存在 $exportDir = Join-Path $env:USERPRORE "Desktop\Archi" if (-not (Test-Path $exportDir)) { New-Item -ItemType Directory -Path $exportDir -Force | Out-Null } # 导出结果 $output | Select-Object ID, Type, Name, Documentation | Export-Csv (Join-Path $env:USERPROFILE "Desktop\C.csv") -NoTypeInformation -Encoding UTF8 $output | Select-Object ID, Type, Name, Documentation | Export-Csv (Join-Path $exportDir "newElements.csv") -NoTypeInformation -Encoding UTF8
调整说明
- 优化了匹配效率,用哈希集合代替逐行遍历匹配,数据量大的时候速度提升明显
- 修正了正则匹配的语法错误,改用
-match操作符识别包含-/_的Jobstream - 增加了重复记录过滤逻辑,同个Jobstream默认只保留第一条,需要保留所有关联Job的话可以自行注释对应代码
- 增加了输出文件夹自动创建逻辑,避免路径不存在导致的导出失败
- 统一了路径拼接方式,避免不同系统环境下的路径格式错误
内容的提问来源于stack exchange,提问作者user16117306
相关产品推荐
相关产品推荐

