Фильтровать CSV-файл в Poweshell - PullRequest
1 голос
/ 14 апреля 2020

У меня есть файл 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

Должно совпадать с именем клиента, именем сохраненного набора и статусом. Если клиент с тем же именем набора сохранений становится успешным в любой другой группе, он должен быть помечен как успешный, но если клиент с определенным именем набора сохранения не удался, он должен быть помечен как Failed.

1 Ответ

4 голосов
/ 14 апреля 2020

Вы можете сделать это с помощью предложений 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

Результат:

Client Name Save Set Name Group  Status
----------- ------------- -----  ------
c           FS            Group1 Failed
c           SQL           Group4 Failed
d           DBA           Group1 Failed
e           RDM           Group1 Failed

Просмотр ваших последних комментариев, Я думаю / надеюсь, что теперь я понимаю вопрос лучше. К счастью, код можно легко настроить для группировки не только по «имени клиента», но и по «имени сохраненного набора», как показано ниже.

$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:

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

Используя пример 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

выход:

Client Name           Save Set Name  Group               Status
-----------           -------------  -----               ------
gsiecwt2020.web.local pseudo_saveset D_CWT_File_System_1 failed
...