如何使用PowerShell过滤CSV文件?

问题描述 投票:1回答:1

我有一个备份报告的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 NameSave Set NameStatus。如果具有相同Save Set Name的客户端在任何其他组中均获得成功,则应将其标记为成功,但是如果具有特定Save Set Name的客户端失败,则应将其标记为Failed

powershell grouping ps ps1
1个回答
4
投票

您可以使用Group-ObjectWhere-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失败
© www.soinside.com 2019 - 2024. All rights reserved.