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

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(原始文件)

NameIPV46PortCurstateSuggestedPRDDisplay Nametech OwnerSlack ChannelSupport Email
name 11.2.3.48080DownNoNoNoNoNoNo

CSV2(更新后的数据文件)

NameIPV46PortCurstateSuggestedPRDDisplay Nametech OwnerSlack ChannelSupport Email
name 11.2.3.48080DownNoPRD123TMOLGaryTMOL SupportSupport@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:40:22