PowerShell对比两个CSV并更新CSV1的实现方法求助
问题与解决方案
需求说明
我并非寻求代写服务,而是希望有人能为我指明方向,因为我完全不知道该如何推进。
概述
我有一个包含大量数据的CSV文件(CSV1),部分数据来自脚本,部分为手动录入。我可以运行脚本获取新数据生成CSV2,现在希望找到一种方法,将CSV1与CSV2对比,并把CSV2中的更新数据同步到CSV1中,匹配规则是基于Name、IPV46和Port三个字段匹配条目。两个CSV文件的表头和布局完全一致。
当前已有代码
$Vips_to_check = @{} Import-Csv 'C:\Users\user\Documents\20221201\Netscaler VIPs per Cluster_edited - Raw Data.csv' | Where-Object {$_.PRD -match "No PRD code from VIP IP and VIP has no backend IPs" -or $_.PRD -match "No PRD code found from VIP or backend IPs" -or $_.PRD -match "No PRD code found from backend IPs" -and $_.ipv46 -notcontains "0.0.0.0"} | $Results_from_PIM = Import-Csv 'C:\Users\user\Documents\20221201\VIP-Owners_edited.csv'
CSV示例
CSV1(原始文件)
| Name | IPV46 | Port | Curstate | Suggested | PRD | Display Name | tech Owner | Slack Channel | Support Email |
|---|---|---|---|---|---|---|---|---|---|
| name 1 | 1.2.3.4 | 8080 | Down | No | No | No | No | No | No |
CSV2(更新后的数据文件)
| Name | IPV46 | Port | Curstate | Suggested | PRD | Display Name | tech Owner | Slack Channel | Support Email |
|---|---|---|---|---|---|---|---|---|---|
| name 1 | 1.2.3.4 | 8080 | Down | No | PRD123 | TMOL | Gary | TMOL Support | Support@email.com |
我的尝试与困惑
我猜测可以通过哈希表实现,但始终没掌握正确格式,试过以下代码但行不通:
$ht = $Results_from_pim @{} $_.Name = (cant figure out how to reference the cell) $_.PRD = $_("Display Name") $_("Tech Owner")
我不清楚把数据存入哈希表后,如何覆盖CSV1中的对应数据。查了微软官方的哈希表和PSCustomObject文档,但更困惑了。目前只有4-5条差异数据,手动在Excel改更快,但脚本规模扩大后手动修改会越来越耗时。
更新:已从CSV2创建哈希表
$ht = @{} foreach ($item in $Results_from_PIM) { "name = $($item.name)" "prd = $($item.PRD)" "Display Name = $($item.'Display Name')" "Tech Owner = $($item.'Tech Owner')" "Slack Channel = $($item.'Slack Channel')" "Support Email = $($Item.'Support Email')" }
现在需要实现与CSV1的对比和同步。
解决方案思路
1. 构建CSV2的查找哈希表
为了快速匹配条目,用Name+IPV46+Port作为哈希表的键(确保唯一标识每条记录),值为CSV2中对应的完整对象:
# 构建CSV2的查找哈希表,复合键确保唯一匹配 $csv2Lookup = @{} foreach ($item in $Results_from_PIM) { # 创建复合键,用特殊字符分隔避免冲突 $key = "$($item.Name)|$($item.IPV46)|$($item.Port)" $csv2Lookup[$key] = $item }
2. 遍历CSV1并更新匹配条目
读取CSV1的所有数据,遍历每条记录,用同样的复合键去哈希表中查找匹配项,找到后就更新指定字段:
# 读取CSV1原始数据 $csv1Data = Import-Csv 'C:\Users\user\Documents\20221201\Netscaler VIPs per Cluster_edited - Raw Data.csv' # 遍历CSV1数据,更新匹配条目 foreach ($entry in $csv1Data) { $key = "$($entry.Name)|$($entry.IPV46)|$($entry.Port)" if ($csv2Lookup.ContainsKey($key)) { # 更新需要同步的字段 $entry.PRD = $csv2Lookup[$key].PRD $entry.'Display Name' = $csv2Lookup[$key].'Display Name' $entry.'tech Owner' = $csv2Lookup[$key].'tech Owner' $entry.'Slack Channel' = $csv2Lookup[$key].'Slack Channel' $entry.'Support Email' = $csv2Lookup[$key].'Support Email' # 如果有其他需要更新的字段,继续添加即可 } } # 将更新后的数据写回CSV1(建议先备份原文件) $csv1Data | Export-Csv 'C:\Users\user\Documents\20221201\Netscaler VIPs per Cluster_edited - Raw Data.csv' -NoTypeInformation -Encoding UTF8
3. 关键注意事项
- 备份原始CSV1文件:在执行写入操作前,一定要先复制一份原文件作为备份,避免数据丢失。
- 复合键的唯一性:确保
Name+IPV46+Port的组合能唯一标识每条记录,如果有重复可能导致匹配错误。 - 字段名称大小写:PowerShell中对象属性名是大小写不敏感的,但要注意CSV中的字段名和代码中的引用一致(比如
tech Owner带空格,必须用引号包裹)。 - 编码问题:使用
-Encoding UTF8避免导出CSV时出现乱码问题。
内容的提问来源于stack exchange,提问作者asthmatic_weasel
相关产品推荐
相关产品推荐

