Powershell -比较CSV 1和CSV 2,然后更新CSV 1

ix0qys7i  于 2022-12-23  发布在  Shell
关注(0)|答案(2)|浏览(196)

我不是在寻找一个写作服务,但请有人能指出我在正确的方向,因为我完全迷失了如何进行。

    • 概述**我有一个包含大量数据的CSV,其中一些数据来自脚本,一些数据是手动估算的。我可以运行脚本并获得新数据,这很好。我想做的是找到一种方法来比较原始CSV 1和新CSV 2并更新CSV 1。
Code I currently have 

$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的有相同的标题和布局,这是好的。我假设!
CSV 1
名称IPV46端口Curstate建议PRD显示名称技术所有者Slack渠道支持电子邮件
name 1 1.2.3.4 8080 Down No No No No No No No
CSV 2
名称IPV46端口Curstate建议PRD显示名称技术所有者Slack渠道支持电子邮件
name 1 1.2.3.4 8080 Down No PRD123 TMOL Gary TMOL Support Support@email.com nsr.sys
我想创建一个散列表,但我就是不明白它们的格式。

$ht = $Results_from_pim @{}
      $_.Name = (cant figure out how to reference the cell)
      $_.PRD = 
    $_.("Display Name") 
    $_.("Tech Owner")

一旦我在哈希表中有了数据,我如何覆盖CSV 1数据?
任何要点或指南都会很棒。我已经试着阅读了https://learn.microsoft.com/en-gb/powershell/scripting/learn/deep-dives/everything-about-hashtable?view=powershell-7.3https://learn.microsoft.com/en-us/powershell/scripting/learn/deep-dives/everything-about-pscustomobject?view=powershell-7.3
但这让我更加困惑。
目前的差异只有4或5个条目,它会更快,我手动编辑在excel中,但随着这个脚本变得更大,我可以看到它是更耗时的手动做。
一如既往地谢谢你。
更新

$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')"
           }

我已经创建了散列表,我想从CSV 2。只是得到它比较CSV 1。
更新2
根据@theo的要求,我调整了问题。另外,为了澄清,当我想要合并CSV时,它基于匹配两个CSV上的名称、IPV46和端口,然后将更新的数据从CSV2移动到CSV1。

rqenqsqc

rqenqsqc1#

您可以使用下面的代码来完成此操作(不需要额外的模块):

$csv1 = 'C:\Users\user\Documents\20221201\Netscaler VIPs per Cluster_edited - Raw Data.csv'
$csv2 = 'C:\Users\user\Documents\20221201\VIP-Owners_edited.csv'

$Results_from_PIM = Import-Csv -Path $csv2
$newData = Import-Csv -Path $csv1 | ForEach-Object {
    $search  = $_.Name + $_.IPV46 + $_.Port   # combine these fields into a single string
    $compare = $Results_from_PIM | Where-Object { ($_.Name + $_.IPV46 + $_.Port) -eq $search }
    if ($compare) {
        # output the result from csv2
        $compare
    }
    else {
        # output the original row from csv1
        $_
    }
}

# now you can save the updated data to a new file or overwrite csv1 if you like
$csv3 = 'C:\Users\user\Documents\20221201\VIP-Owners_Updated.csv'
$newData | Export-Csv -Path $csv3 -NoTypeInformation

请阅读格式

bvpmtnay

bvpmtnay2#

在通过@jdweng直接转到In PowerShell, what's the best way to join two tables into one?后,我执行了以下操作,这似乎符合我的要求
安装模块名称联接模块作用域当前用户

$Vips_to_check = Import-Csv 'C:\Users\user\Documents\20221201\Netscaler VIPs per Cluster - Raw Data.csv'
                                                               
$Results_from_PIM = Import-Csv 'C:\Users\user\Documents\20221201\VIP-Owners.csv'

$Vips_to_check | Update-Object $Results_from_PIM -On name, Ipv46, port | Export-Csv 'C:\Users\user\Documents\20221201\Final_data1.csv'

将使用更大的数据集进行进一步测试,但似乎按要求工作。

相关问题