Добавление нескольких данных текстового файла в CSV-файл с PowerShell в определенные c столбцы - PullRequest
0 голосов
/ 14 апреля 2020

Это мой код до сих пор:

# Master
Import-Csv -Path "C:\PS\SessionData\MasterList.csv" | Select-Object "Service Unit",@{ Name='UserID';Expression = { $PSItem.'UserID'.ToLower()} } | Export-Csv C:\PS\SessionData\MasterList2Col.csv -NoTypeInformation
# Get list of total numbers per Service Unit
Import-Csv -Path "C:\PS\SessionData\MasterList2Col.csv" | Select-Object -ExpandProperty "Service Unit" | Group-Object | Select-Object Name,Count | Out-File "C:\PS\SessionData\countUsersByBU.txt"

#Citrix
Import-Csv -Path "C:\PS\SessionData\Session Summary 09_04_2020.csv" | Select-Object -Property @{ Name="UserID";Expression={ $PSItem."Associated User" } } -Unique | Export-Csv -Path "C:\PS\SessionData\sessionCRX.csv" -NoTypeInformation
$citrixUsers = Import-Csv -Path "C:\PS\SessionData\sessionCRX.csv" | Select-Object -ExpandProperty UserID
Import-Csv -Path "C:\PS\SessionData\MasterList2Col.csv" | Where-Object {$citrixUsers -contains $PSItem.UserID} | ForEach-Object {"$($PsItem.'Service Unit')" } | Out-File "C:\PS\SessionData\totalCRX.txt"
$fileCRX = "C:\PS\SessionData\totalCRX.txt"
Get-Content $fileCRX | Group-Object | Select-Object Name,Count | Out-File C:\PS\SessionData\countCRX.txt

#VPN
Import-Csv -Path "C:\PS\SessionData\Cisco Anyconnect users 09-04.csv" | Where-Object { $PSItem.Status -eq 'Active' } | Select-Object @{Name = 'UserID'; Expression = {($_.Name -split '\\',2)[-1] }} -Unique | Export-Csv -Path "C:\PS\SessionData\sessionVPN.csv" -NoTypeInformation
$vpnUsers = Import-Csv -Path "C:\PS\SessionData\sessionVPN.csv" | Select-Object -ExpandProperty UserID
Import-Csv -Path "C:\PS\SessionData\MasterList2Col.csv" | Where-Object {$vpnUsers -contains $PSItem.UserID} | ForEach-Object {"$($PsItem.'Service Unit')" } | Out-File "C:\PS\SessionData\totalVPN.txt"
$fileVPN = "C:\PS\SessionData\totalVPN.txt"
Get-Content $fileVPN | Group-Object | Select-Object Name,Count | Out-File C:\PS\SessionData\countVPN.txt

#Create new csv file with totals
$txtMain = "C:\PS\SessionData\countUsersByBU.txt"
$txtCRX = "C:\PS\SessionData\countCRX.txt"
$txtVPN = "C:\PS\SessionData\countVPN.txt"

#End result new.csv 
#Get-Content ??? | Export-Csv -Path "C:\PS\SessionData\new.csv"

У меня есть три текстовых файла, в которых есть столбец «Имя» и столбец «Количество», пример ниже:

$txtMain = "C:\PS\SessionData\countUsersByBU.txt"
Name    Count
----    -----
HR       20
Account  25
Dev      25
Sales    25
Garden   10
$txtCRX = "C:\PS\SessionData\countCRX.txt"
Name    Count
----    -----
HR         3
Account    6
Dev        9
Garden     7
$txtVPN = "C:\PS\SessionData\countVPN.txt"
Name    Count
----    -----
HR         7
Account    8
Dev        1
Sales      5

Мне нужно получить эти данные в новый файл .csv. Где данные txtMain имеют все столбцы Name и столбец общего количества. Данные из txtOne должны проверить файл new.csv для столбца Name и поместить значение Count в третий столбец. Данные из txtTwo должны проверить файл new.csv для столбца Name и поместить значение Count в четвертый столбец. например, new.csv

Name   (txtMain)   (txtCRX)   (txtVPN)   (Percentage)
----   ---------   --------   --------   ------------
HR          20          3         7          50%
Account     25          7         8          60%         
Dev         25          9         1          40%
Sales       25                    5          20%
Garden      10          7                    70%

Затем последний столбец, который является вычисляемым выражением, которое вычисляет процентное содержание столбцов txtCRX и txtVPN из столбца txtMain. Извиняюсь за вопрос noob, некоторое время не работал с Powershell и не уверен, как написать окончательный оператор Get и Export для создания файла new.csv.

1 Ответ

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

Используя ваш пример входных файлов, вы можете сделать это:

# Create an object collection with totals counts from the helper files
$result = Import-Csv -Path "C:\PS\SessionData\countUsersByBU.txt" | Select-Object *,countCRX,countVPN
# add info from countCRX.txt
Import-Csv -Path "C:\PS\SessionData\countCRX.txt" | ForEach-Object {
    $name = $_.Name
    $item = $result | Where-Object { $_.Name -eq $name }
    if ($item) { $item.CountCRX = [int]$_.Count }
}

# add info from countVPN.txt
Import-Csv -Path "C:\PS\SessionData\countVPN.txt" | ForEach-Object {
    $name  = $_.Name
    $item = $result | Where-Object { $_.Name -eq $name }
    if ($item) { $item.CountVPN = [int]$_.Count }
}

# finally calculate the percentages
$result = $result | Select-Object *, @{Name = 'Percentage'; Expression = {'{0:P0}' -f (([int]$_.countCRX + [int]$_.countVPN) / [int]$_.Count)}}

# output on screen
$result | Format-Table -AutoSize

# output to CSV
$result | Export-Csv -Path 'C:\PS\SessionData\new.csv' -UseCulture -NoTypeInformation

Вывод на экран:

Name    Count countCRX countVPN Percentage
----    ----- -------- -------- ----------
HR      20           3        7 50%       
Account 25           6        8 56%       
Dev     25           9        1 40%       
Sales   25                    5 20%       
Garden  10           7          70%

PS вам нужно создать 3 файла countUsersByBU.txt, countCRX.txt и CountVPN.txt с Export-Csv -Path 'X:\thefile -NoTypeInformation вместо Out-File для получения используемых файлов для работы.
Обычно вы предоставляете им расширение .csv, но .txt также будет работать (хотя технически некорректно ..)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...