使用PowerShell连接两个不同的csv文件

使用PowerShell连接两个不同的csv文件,powershell,csv,join,compare,export-to-csv,Powershell,Csv,Join,Compare,Export To Csv,第一个.csv文件是基于客户端名称的每月备份大小(KB)。第二个.csv文件是基于客户端名称的下一个每月备份大小(KB) 它在A列中列出了所有客户端名称。B列具有客户端的相应策略名称和最后一列备份大小(KB)(即-487402463) 如果客户端大小(16388388488-1238838488=0.37 TB)之间的差异大于0.10 TB,结果将以TB大小显示到csv文件,如下所示 此外,客户机可能与多个策略名称相关 我的问题是:我也想补充一些东西 备份大小可能在下个月减少,如主机名15、公

第一个.csv文件是基于客户端名称的每月备份大小(KB)。第二个.csv文件是基于客户端名称的下一个每月备份大小(KB)

它在A列中列出了所有客户端名称。B列具有客户端的相应策略名称和最后一列备份大小(KB)(即-487402463)

如果客户端大小(16388388488-1238838488=0.37 TB)之间的差异大于0.10 TB,结果将以TB大小显示到csv文件,如下所示

此外,客户机可能与多个策略名称相关

我的问题是:我也想补充一些东西

  • 备份大小可能在下个月减少,如主机名15、公司政策11
  • 此外,hostname55、Company_Policy_XXX可能具有不同的策略名称
  • hostnameXX,Company_Policy_XXX,0和hostnameXX,Company_Policy_XXX,41806794可能是重复的客户端和策略名称。如果这在CSV2中不存在,那么我希望显示为负数(-0.14),如下所示。或者也可能存在于CSV2主机名ZZ、公司政策XXX中
  • 最后,它可能出现在CSV2中,例如主机名、公司政策和XXX。 我使用了连接对象模块
示例CSVFile1.csv

Client Name,Policy Name,KB Size
hostname1,Company_Policy,487402463
hostname2,Company_Policy,227850336
hostname3,Company_Policy_11,8360960
hostname4,Company_Policy_11,1238838488
hostname15,Company_Policy_11,3238838488
hostname1,Company_Policy_55,521423110
hostname10,Company_Policy,28508975
hostname3,Company_Policy_66,295925
hostname5,Company_Policy_22,82001824
hostname2,Company_Policy_33,26176885
hostnameXX,Company_Policy_XXX,0
hostnameXX,Company_Policy_XXX,141806794
hostnameYY,Company_Policy_XXX,121806794
hostname55,Company_Policy_XXX,41806794
hostnameZZ,Company_Policy_XXX,0
hostnameZZ,Company_Policy_XXX,141806794
示例CSVFile2.csv

Client Name,Policy Name,KB Size
hostname1,Company_Policy,487402555
hostname2,Company_Policy,227850666
hostname3,Company_Policy_11,8361200
hostname4,Company_Policy_11,1638838488
hostname1,Company_Policy_55,621423110
hostname15,Company_Policy_11,1238838488
hostname10,Company_Policy,28908975
hostname3,Company_Policy_66,295928
hostname5,Company_Policy_22,92001824
hostname2,Company_Policy_33,36176885
hostname22,Company_Policy,291768854
hostname23,Company_Policy,291768854
hostname55,Company_Policy_BBB,191806794
hostnameZZ,Company_Policy_XXX,0
hostnameZZ,Company_Policy_XXX,291806794
hostnameSS,Company_Policy_XXX,0
hostnameSS,Company_Policy_XXX,291806794
期望输出:

Client Name,Policy Name,TB Size
hostname4,Company_Policy_11,0.37
hostname22,Company_Policy,0.27
hostname23,Company_Policy,0.27
hostnameYY,Company_Policy_XXX,-0.12
hostnameXX,Company_Policy_XXX,-0.14
hostname15,Company_Policy_11,-2
hostname55,Company_Policy_BBB,0.15
hostnameZZ,Company_Policy_XXX,0.15
hostnameSS,Company_Policy_XXX,0.29
以下是我目前的脚本:

$CSV2 | FullJoin $CSV1 `
    -On 'Client Name','Policy Name' `
    -Property 'Client Name',
              'Policy Name', 
              @{'TB Size' = {[math]::Round(($Left.'KB Size' - $Right.'KB Size') * 1KB / 1TB, 2)}} | 
    Where-Object  {[math]::Abs($_.'TB Size') -gt 0.10} | Export-Csv C:\Toolbox\DataReport.csv -NoTypeInformation

你可以做一些类似下面的事情。这假设您希望从CSV2值中减去CSV1值

# Read CSV files and make CSV1 sizes negative. Makes summing totals simpler.
$1 = Import-Csv CSVFile1.csv | Foreach-Object { $_.'KB Size' = -$_.'KB Size'; $_ }
$2 = Import-Csv CSVFile2.csv

# Calculated Properties to be used with Select-Object
$CalculatedProperties = @{n='Client Name';e={$_.Group.'Client Name' | Get-Unique}},
                        @{n='Policy Name';e={$_.Group.'Policy Name' | Get-Unique}},
                        @{n='TB Size';e={[math]::Round(($_.Group.'KB Size' | Measure -Sum).Sum*1KB/1TB,2)}}

# Grouping objects based on unique client and policy name combinations
$1 + $2 | Group-Object 'Client Name','Policy Name' |
    Select-object $CalculatedProperties |
        Where {[math]::Abs($_.'TB Size') -gt 0.10}

您希望如何处理具有不同策略的重复客户端名称?例如,您所需的输出忽略了hostname1,这正是我所质疑的场景。是的,一个客户端可能与多个策略名称相关。事实上,它不会忽视。从我所看到的情况来看,如果我从hostname1、Company_Policy_55621423110(不大于0.10 TB)中减去hostname1、Company_Policy_55521423110,则不会返回任何内容。抱歉,我无法按照您的要求操作:两个列表中都有重复的公用密钥(如
hostnameZZ、Company_Policy_XXX
)。这就提出了一个问题,当这个副本只在一侧交换时,您会期望什么?(知道列表显然没有顺序。但是重复的是???…这将是一个非常奇怪的定义…),或者如果有重复的列表,比如
hostnamez,Company\u Policy\u XXX
,在一边而不是另一边呢?我想您需要在列表中添加其他属性,如
备份日期
,以获得更精简的需求。