我有一个备份报告的CSV文件,其中有多列。我只想获取那些使用特定存储集从未成功的客户。
样本输入文件是
Client Name,Save Set Name,Group,Status
a,All,Group1,Failed
a,SQL,Group2,succeeded
b,SQL,Group1,Failed
c,FS,Group1,Failed
d,DBA,Group1,Failed
e,RDM,Group1,Failed
a,ALL,Group2,succeeded
b,SQL,Group3,succeeded
c,SQL,Group4, Failed
输出
Client Name Save Set Name Status Group
a All Failed Group1
b SQL Failed Group1
c FS Failed Group1
d DBA Failed Group1
e RDM Failed Group1
c SQL Failed Group4
预期输出
Client Name,Save Set Name,Group,Status
c,FS,Group1,Failed
d,DBA,Group1,Failed
e,RDM,Group1,Failed
c,SQL,Group4, Failed
在下面的命令中,我面临的问题是,我要获得在其他组中获得成功的Failed
客户,而我只希望那些具有存储集的客户失败并且没有任何成功价值的客户。状态。
Get-Content E:\Report\Daily_Failed.csv |
ConvertFrom-Csv |
Select-Object -Unique * |
Group-Object -Property 'Client Name', 'Save Set Name', 'Group' |
Where-Object { 0 -eq ($_.Group | Where-Object Status -eq 'succeeded').Count } |
Select-Object -Expand Group |
Select-Object "Client Name", "Save Set Name", "status", "Group" |
Export-Csv -NoTypeInformation E:\Report\Failed_$CurrentDate.csv
示例2。
Client Name,Save Set Name,Group,Status
gsiecwt2020.web.local,pseudo_saveset,D_CWT_File_System_1,failed
gsiecwt2020.web.local,J:\System,D_CWT_File_System_2,succeeded
gsiecwt2020.web.local,K:\System,D_CWT_File_System_1,succeeded
gsiecwt2020.web.local,K:\System,D_CWT_File_System_3,failed
期望的输出
gsiecwt2020.web.local,pseudo_saveset,D_CWT_File_System_1,failed
应该匹配Client Name
,Save Set Name
和Status
。如果具有相同Save Set Name
的客户端在任何其他组中均获得成功,则应将其标记为成功,但是如果具有特定Save Set Name
的客户端失败,则应将其标记为Failed
。
您可以使用Group-Object
和Where-Object
子句来完成此操作。
对于演示,我使用的是Here-String;在现实生活中,您可以使用
从文件导入csv$csv = Import-Csv -Path 'X:\yourInputFile.csv'
代码:
$csv = @"
Client Name,Save Set Name,Group,Status
a,All,Group1,Failed
a,SQL,Group2,succeeded
b,SQL,Group1,Failed
c,FS,Group1,Failed
d,DBA,Group1,Failed
e,RDM,Group1,Failed
a,ALL,Group2,succeeded
b,SQL,Group3,succeeded
c,SQL,Group4, Failed
"@ | ConvertFrom-Csv
$result = $csv | Group-Object 'Client Name' | ForEach-Object {
$succeeded = $_.Group | Where-Object { $_.Status -eq 'succeeded' }
if (!$succeeded) { $_.Group } # never succeeded, so output these
}
# output on screen
$result | Format-Table -AutoSize
# output to CSV
$result | Export-Csv -Path 'X:\yourFilteredCsv.csv' -UseCulture -NoTypeInformation
结果:
客户端名称存储集名称组状态----------- ------------- ----- ------c FS组1失败c SQL Group4失败d DBA组1失败e RDM组1失败
看到您的最新评论,我认为/希望我现在对问题的理解更好。幸运的是,可以轻松地将代码调整为不仅可以在“客户端名称”上进行分组,而且还可以在“存储集名称”上进行分组,如下所示。
$result = $csv | Group-Object 'Client Name','Save Set Name' | ForEach-Object {
# if any of the group items have a status of 'succeeded', skip that group
$succeeded = $_.Group | Where-Object { $_.Status -eq 'succeeded' }
if (!$succeeded) { $_.Group } # never succeeded, so output these
}
# output on screen
$result | Format-Table -AutoSize
# output to CSV
$result | Export-Csv -Path 'X:\yourFilteredCsv.csv' -UseCulture -NoTypeInformation
使用示例1:
客户端名称,存储集名称,组,状态a,全部,第1组,失败SQL组2成功b,SQL,Group1,失败c,FS,Group1,失败d,DBA,Group1,失败e,RDM,Group1,失败a,ALL,Group2,成功b,SQL,Group3成功c,SQL,Group4,失败
产量:
客户端名称存储集名称组状态----------- ------------- ----- ------c FS组1失败d DBA组1失败e RDM组1失败c SQL Group4失败
使用示例2:
客户端名称,存储集名称,组,状态gsiecwt2020.web.local,pseudo_saveset,D_CWT_File_System_1,失败gsiecwt2020.web.local,J:\ System,D_CWT_File_System_2成功gsiecwt2020.web.local,K:\ System,D_CWT_File_System_1成功gsiecwt2020.web.local,K:\ System,D_CWT_File_System_3,失败
产量:
客户端名称存储集名称组状态----------- ------------- ----- ------gsiecwt2020.web.local pseudo_saveset D_CWT_File_System_1失败