Группировка нескольких строк в CSV в одну строку и сохранение в переменную - PullRequest
0 голосов
/ 17 апреля 2020

Скорее всего, очень просто, но я новичок в этом и не совсем уверен, как искать то, что я пытаюсь сделать. Пока что я импортировал и отсортировал файл, но я не уверен, как объединить несколько сбоев для клиента и сохранить их. Я просто отправляю их на хост, чтобы убедиться, что я фиксирую ошибки.

Пример CSV

Результат, SystemID, Customer
SUCCESS, 123, CustomerA
FAIL, 456, CustomerB
FAIL, 456, CustomerB
FAIL, 789, CustomerB
SUCCESS, 111, Customer C
FAIL, 321, CustomerD

Мне нужно сохранить ошибки, чтобы по электронной почте отдельно для каждого клиента.
Клиент электронной почты B
Сбой системы / с (456) и (789)
Клиент электронной почты D
Сбой системы / с (321)

Write-Host "CSVs: $CSVs"
foreach ($CSV in $CSVs) {
    $data = Import-Csv $CSV | Sort-Object Customer
    foreach ($line in $data) {
        if ($line.Result -eq "fail") {
            Write-Host  " Action should be taken for $($line.customer)" -ForegroundColor Green -BackgroundColor Black
            Write-Host "$($line.Result) on SystemID's $($line.SystemID)"
        }     
    }
}


1 Ответ

2 голосов
/ 18 апреля 2020

Вы можете использовать Group-Object и Where-Object для группировки ваших данных на основе сбоев клиента.

foreach ($CSV in $CSVs) {
    $data = Import-Csv $CSV | Sort-Object Customer
    $FailGroups = $data | Where Result -eq 'FAIL' | Group-Object Customer
    foreach ($FailGroup in $FailGroups) {
        $FailedCustomer = $FailGroup.Name
        $FailedSystems = ($FailGroup.Group.SystemID | Foreach-Object { "($_)" }) -join ' & '
        $MailMessage = "Systems/s {0} have failed" -f $FailedSystems
        $FailedCustomer # Outputting customers with failures
        $MailMessage # Outputting failed systems in formatted message
        # Below is a Custom Object that can be exported to CSV or retrieved later
        # [pscustomobject]@{'Customer' = $FailedCustomer; 'Message' = $MailMessage}
    }
}

Теперь вы можете использовать $FailedCustomer и $MailMessage для создания сообщения электронной почты в конце внутренней итерации foreach.

Поскольку Group-Object возвращает объект GroupInfo, вам необходимо получить доступ к его свойству Name для свойства. значения, используемые для определения группировки. Свойство Group содержит строки (объекты) CSV, включенные в группировку.


Если вы go настраиваете маршрут объекта, вы можете сохранить все выходные данные в одну переменную как массив. Затем вы можете экспортировать массив в файл CSV или выполнить итерацию по массиву для ваших задач электронной почты.

$output = foreach ($CSV in $CSVs) {
    $data = Import-Csv $CSV | Sort-Object Customer
    $FailGroups = $data | Where Result -eq 'FAIL' | Group-Object Customer
    foreach ($FailGroup in $FailGroups) {
        $FailedCustomer = $FailGroup.Name
        $FailedSystems = ($FailGroup.Group.SystemID | Foreach-Object { "($_)" }) -join ' & '
        $MailMessage = "Systems/s {0} have failed" -f $FailedSystems
        [pscustomobject]@{'Customer' = $FailedCustomer; 'Message' = $MailMessage}
    }
}
# Export to CSV
$output | Export-Csv -Path C:\Path\FailedCustomers.csv -NoType
# Email customers example
foreach ($customer in $output) {
    $MailParams = @{
        'SmtpServer' = 'smtp.domain.com'
        'Subject' = 'Failures'
        'To' = $customer.Customer
        'From' = you@domain.com
        'Body' = $customer.Message
    }
    Send-MailMessage @MailParams
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...