Проверьте, существует ли значение в одном файле CSV, и добавьте текст stati c в другое поле CSV с помощью Powershell. - PullRequest
0 голосов
/ 19 апреля 2020

Мне нужно проверить, существует ли значение столбца из первого файла CSV в любом из трех других файлов CSV, и вернуть значение в новый файл CSV в порядке приоритета. Поэтому, если поле имени пользователя из allStaff.csv существует в списке имен пользователей в файле sessionVPNct.csv, поместите текст stati c в окончательный файл csv как «VPN». Если он не существует, проверьте следующий csv-файл: sessionCRXct.csv, затем введите текст c CRX, если не проверьте последний файл csv: sessionTMSct.csv, а затем введите текст c TM: если нет текст stati c помещается в окончательный CSV-файл. У меня есть четыре файла CSV, как показано ниже:

1. allStaff.csv
2. VPN.csv
3. CRX.csv
4. TMS.csv

Я импортировал файлы CSV в переменные, как показано ниже:

$allUsers = Import-Csv -Path "C:\allStaff.csv"
$vpn = Import-Csv -Path "C:\VPN.csv" | Select-Object -ExpandProperty UserName
$crx = Import-Csv -Path "C:\CRX.csv" | Select-Object -ExpandProperty UserName
$tms = Import-Csv -Path "C:\TMS.csv" | Select-Object -ExpandProperty UserName

Переменная $ allUsers отображает следующее:

Firstname     LastName   Username    Position          Area
---------     --------   --------    --------          ----
Joe           Bloggs     jbloggs     Gardener          Maintenance
Jim           Smith      jsmith      Accountant        Finance
Bob           Seger      bseger      HR Advisor        Human Resources
Adam          Boson      aboson      Customer Support  IT
Adele         bree       abree       Payroll           Finance

В переменной $ vpn отображается следующее:

Username
--------
jbloggs
jsmith 

В переменной $ crx отображается следующее:

Username
--------
jbloggs
jsmith
bseger

В переменной $ tms отображается следующее:

Username
--------
jbloggs
jsmith
bseger
aboson

Затем у меня есть следующая строка, чтобы запустить файл CSV результата

$result = $allUsers | Select-Object *,ConnectionMethod

Не совсем уверен, как сделать окончательный запрос, который, я считаю, должен быть, если еще l oop to go через все строки в переменной $ result и проверьте другой CSV, если поле имени пользователя существует, затем верните текст stati c.

$result | Export-Csv -Path "C:\allStaffConnections.csv"

Вот как мне нужен финальный файл allStaffConnections.csv файл для отображения.

Firstname     LastName   Username    Position          Area              ConnectionMethod
---------     --------   --------    --------          ----              --------------
Joe           Bloggs     jbloggs     Gardener          Maintenance       VPN
Jim           Smith      jsmith      Accountant        Finance           VPN
Bob           Seger      bseger      HR Advisor        Human Resources   CRX
Adam          Boson      aboson      Customer Support  IT                TMS
Adele         bree       abree       Payroll           Finance           none

Я на правильном пути с приведенным ниже кодом?

$allUsers = Import-Csv -Path "C:\allStaff.csv"
$vpn = Import-Csv -Path "C:\VPN.csv" | Select-Object -ExpandProperty UserName
$crx = Import-Csv -Path "C:\CRX.csv" | Select-Object -ExpandProperty UserName
$tms = Import-Csv -Path "C:\TMS.csv" | Select-Object -ExpandProperty UserName
$vpnText = 'VPN'
$crxText = 'CRX'
$txsText = 'TMS'
$noneText = 'none'

$allUsersExtended = $allUsers | Select-Object *,ConnectionMethod
$results = $allUsersExtended.ForEach(
    {
        if($vpn -Contains $PSItem.UserName) {
            # add $vpnText to ConnectionMethod column for that row in the $result
            $PSItem.ConnectionMethod = $vpnText
        }elseif($crx -Contains $PSItem.UserName) {
            # add $crxText to ConnectionMethod column for that row in the $result
            $PSItem.ConnectionMethod = $crxText
        }elseif($tms -Contains $PSItem.UserName) {
            # add $txsText to ConnectionMethod column for that row in the $result
            $PSItem.ConnectionMethod = $tmsText
        }else {
            # add $noneText to ConnectionMethod column for that row in the $result
            $PSItem.ConnectionMethod = $noteText
        }
    })
$results | Export-Csv -Path "C:\allStaffConnections.csv" -NoTypeInformation

Это дает мне пустой файл allStaffConnections.csv. Я построчно запускаю код и могу получить:

$allUsersExtended = $allUsers | Select-Object *,ConnectionMethod

, что дает мне дополнительный столбец "ConnectionMethod", но после запуска l oop он дает мне пустое allStaffConnections. CSV-файл.

1 Ответ

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

вот один из способов сделать эту работу. [ ухмылка ] предполагает, что вы хотите, чтобы был найден только 1-й тип соединения. если вы хотите, чтобы все они [например, в JBloggs были перечислены все 3 типа], вам нужно будет объединить их.

что он делает ...

  • подделывает чтение в файлах CSV
    , когда готов использовать реальные данные, комментирует или удаляет весь раздел #region/#endregion и использует Get-Content.
  • итерации по основной коллекции
  • использует переключатель для проверки членства в каждом списке типов соединений
    это прерывает коммутатор, когда он находит совпадение, так как предполагает, что вы хотите только 1-й матч если вы хотите получить их все, вам нужно будет их накапливать, а не вырывать из блока переключателей.
  • устанавливает $ConnectionType соответствующим образом
  • создает PSCO со всеми требуемыми реквизитами
    это, вероятно, можно сократить, используя Select-Object, селектор подстановочного свойства и вычисляемое свойство ,
  • отправляет его в $Results коллекцию
  • показывает его на экране
  • сохраняет его в файл CSV

код .. .

#region >>> fake reading in CSV files
#    in real life, use Import-CSV
$AllUsers = @'
FirstName, LastName, UserName, Position, Area
Joe, Bloggs, jbloggs, Gardener, Maintenance
Jim, Smith, jsmith, Accountant, Finance
Bob, Seger, bseger, HR Advisor, Human Resources
Adam, Boson, aboson, Customer Support, IT
Adele, bree, abree, Payroll, Finance
'@ | ConvertFrom-Csv

$Vpn = @'
UserName
jbloggs
jsmith
'@ | ConvertFrom-Csv

$Crx = @'
UserName
jbloggs
jsmith
bseger
'@ | ConvertFrom-Csv

$Tms = @'
UserName
jbloggs
jsmith
bseger
aboson
'@ | ConvertFrom-Csv
#endregion >>> fake reading in CSV files

$Results = foreach ($AU_Item in $AllUsers)
    {
    # this presumes you want only the 1st connection type found
    #     if you want all of them, then you will need to concatenate them
    switch ($AU_Item.UserName)
        {
        {$_ -in $Vpn.UserName}
            {
            $ConnectionType = 'VPN'
            break
            }
        {$_ -in $Crx.UserName}
            {
            $ConnectionType = 'CRX'
            break
            }
        {$_ -in $Tms.UserName}
            {
            $ConnectionType = 'TMS'
            break
            }
        default
            {
            $ConnectionType = 'None'
            }
        }

    [PSCustomObject]@{
        FirstName = $AU_Item.FirstName
        LastName = $AU_Item.LastName
        UserName = $AU_Item.UserName
        Position = $AU_Item.Position
        Area = $AU_Item.Area
        ConnectionTYpe = $ConnectionType
        }
    }

# on screen
$Results

# send to CSV
$Results |
    Export-Csv -LiteralPath "$env:TEMP\brokencrow_-_UserConnectionType.csv" -NoTypeInformation

усечено на экране вывода ...

FirstName      : Joe
LastName       : Bloggs
UserName       : jbloggs
Position       : Gardener
Area           : Maintenance
ConnectionTYpe : VPN

[*...snip...*] 

FirstName      : Adele
LastName       : bree
UserName       : abree
Position       : Payroll
Area           : Finance
ConnectionTYpe : None

содержимое файла CSV из brokencrow_-_UserConnectionType.csv ...

"FirstName","LastName","UserName","Position","Area","ConnectionTYpe"
"Joe","Bloggs","jbloggs","Gardener","Maintenance","VPN"
"Jim","Smith","jsmith","Accountant","Finance","VPN"
"Bob","Seger","bseger","HR Advisor","Human Resources","CRX"
"Adam","Boson","aboson","Customer Support","IT","TMS"
"Adele","bree","abree","Payroll","Finance","None"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...