如何使用PowerShell筛选CSV文件?

如何使用PowerShell筛选CSV文件?,powershell,grouping,ps,ps1,Powershell,Grouping,Ps,Ps1,我有一个备份报告的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,

我有一个备份报告的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
在下面的命令中,我面临的问题是,我将在其他组中获得成功的客户机设置为失败客户机,而我只希望那些存储集已失败且状态中没有任何成功值的客户机

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
它应该与客户端名称、存储集名称和状态匹配。 如果具有相同存储集名称的客户端在任何其他组中成功,则应将其标记为成功,但如果具有特定存储集名称的客户端失败,则应将其标记为失败。

您可以使用group对象和Where Object子句执行此操作

对于演示,我使用了一个Here字符串;在现实生活中,您将使用

$csv = Import-Csv -Path 'X:\yourInputFile.csv'
代码:

结果:

Client Name Save Set Name Group Status ----------- ------------- ----- ------ c FS Group1 Failed c SQL Group4 Failed d DBA Group1 Failed e RDM Group1 Failed 使用示例1:

收益率:

使用示例2:

收益率:

您可以使用Group对象和Where对象子句来实现这一点

对于演示,我使用了一个Here字符串;在现实生活中,您将使用

$csv = Import-Csv -Path 'X:\yourInputFile.csv'
代码:

结果:

Client Name Save Set Name Group Status ----------- ------------- ----- ------ c FS Group1 Failed c SQL Group4 Failed d DBA Group1 Failed e RDM Group1 Failed 使用示例1:

收益率:

使用示例2:

收益率:


这回答了你的问题吗?这回答了你的问题吗@西奥-谢谢你的努力。在您的脚本中,我面临一个问题,它没有考虑存储集选项卡。如果任何保存成功,则会将complete Client标记为successful,但实际情况并非如此。我已经用新的更新了我的问题example@GURUSINGH我不知道你的意思。。字段存储集名称出现在输出中,不,它没有标记客户端已成功。你的问题是找到从未成功过的客户,所以在每个组中,我都在测试是否有任何“成功”状态。只有当情况并非如此时,客户端才会获得输出,因为该客户端的所有状态字段都显示为“失败”。另外,我没有看到问题被编辑。@Theo-问题更新了新的示例和解释。请check@Theo-你能帮个忙吗?这就是我要找的。非常感谢。@Theo-谢谢你的努力。在您的脚本中,我面临一个问题,它没有考虑存储集选项卡。如果任何保存成功,则会将complete Client标记为successful,但实际情况并非如此。我已经用新的更新了我的问题example@GURUSINGH我不知道你的意思。。字段存储集名称出现在输出中,不,它没有标记客户端已成功。你的问题是找到从未成功过的客户,所以在每个组中,我都在测试是否有任何“成功”状态。只有当情况并非如此时,客户端才会获得输出,因为该客户端的所有状态字段都显示为“失败”。另外,我没有看到问题被编辑。@Theo-问题更新了新的示例和解释。请check@Theo-你能帮个忙吗?这就是我要找的。谢谢。 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 Group Status ----------- ------------- ----- ------ c FS Group1 Failed d DBA Group1 Failed e RDM Group1 Failed c SQL Group4 Failed 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 Client Name Save Set Name Group Status ----------- ------------- ----- ------ gsiecwt2020.web.local pseudo_saveset D_CWT_File_System_1 failed