Разбить столбец массива и привести к дополнительным столбцам - PullRequest
0 голосов
/ 27 марта 2019

У меня есть таблица (CSV), которая показывает всех пользователей, которые когда-либо входили в систему на нескольких компьютерах. Пользователи могут иметь 2 учетных записи, одно имя пользователя начинается с «a», а другое - с «b», например, a100 и b100 (пользователь позади - один и тот же человек).

Теперь мне нужно получить компьютеры, на которых зарегистрировано более двух учетных записей, которые не принадлежат одним и тем же пользователям. Таким образом, A64 и B64 не указываются как отдельные пользователи.

Вот базовый список, который у меня есть:

PC1,A64,B52,B64,A41
PC2,A51,B42,B51,A23
PC3,A42,B51
PC4,A5,B5
PC5,A1,B1,A14,A6

Мой план состоял в том, чтобы разбить столбец «Пользователь» на несколько столбцов, чтобы таблица выглядела следующим образом:

Computername,user1,user2,user3,user4,UserX

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

Как вы думаете, это имеет смысл?

Теперь я уже застрял в первом задании. Я знаю, как выполнить итерацию по второму столбцу, но как мне удалось получить результат в другой массив, чтобы вывод был таким:

Computername,user1,user2,user3,user4,UserX

Можете ли вы помочь мне разделить?

$UserComputers = import-csv -Delimiter ";" "input.csv" -Header 
'Computername','user1','user2','user3','user4'


$UserComputers | Select-Object *,
    @{n='User1';e={$_.User1.Split(',')[0]}},
    @{n='User2';e={$_.User1.Split(',')[1]}} 

Я получаю сообщение об ошибке: Select-Object: свойство не может быть обработано, поскольку свойство "User1" уже существует.

Ответы [ 3 ]

2 голосов
/ 27 марта 2019

Полезно сделать «пользователь» массивом.

Get-Content "input.csv" | foreach {
    $name, $users = $_.Split(",")
    [pscustomobject]@{ Name = $name; Users = $users }
} | Where-Object { ($_.Users.Substring(1) | Select-Object -Unique).Count -gt 2 }

Выход ниже.

Name Users               
---- -----               
PC1  {A64, B52, B64, A41}
PC2  {A51, B42, B51, A23}
PC3  {A42, B51}          
PC5  {A1, B1, A14, A6} 
1 голос
/ 27 марта 2019

Входной файл (input.csv)

PC1,A64,B52,B64,A41
PC2,A51,B42,B51,A23
PC3,A42,B51
PC4,A5,B5
PC5,A1,B1,A14,A6

Скрипт Powershell

Get-Content -Path .\input.csv | 
Select-Object @{ Name = "Computer"; Expression = { $_.Split(',')[0] } }, 
              @{ Name="Users"; Expression = { $_.Split(',')[1..($_.Split(',').Length-1)] | 
Foreach-Object { $_.Substring(1) } | Select-Object -Unique } } | 
Where-Object { $_.Users.Count -gt 2 }

Результат:

Computer      Users
------------- -----
PC1      {64, 52, 41}
PC2      {51, 42, 23}
PC5      {1, 14, 6}  

P.S. Бонус: если вы хотите видеть более 4 элементов массива на экране, измените переменную $FormatEnumerationLimit = 20 Объяснение значения переменной

0 голосов
/ 27 марта 2019

Если ваш файл похож на ваш базовый список, вы можете сделать следующее, чтобы создать новый файл со всеми необходимыми столбцами:

$maxColCount = 0
$data = get-content input.csv
foreach ($line in $data) {
   $MaxColCount = [math]::Max($maxcolcount,($line -split ",").count)
}

$headers = @("ComputerName")
$MaxUserCount = $MaxColCount - 1
Foreach ($c in (1..$MaxUserCount)) {
   $Headers += "User$c"
}
$Headers = $Headers -join ","

$Headers,$data | Set-Content "output.csv"

Код выше предполагает, что input.csv имеет следующий формат икаждый столбец после первого является пользователем:

PC1,A64,B52,B64,A41
PC2,A51,B42,B51,A23
PC3,A42,B51
PC4,A5,B5
PC5,A1,B1,A14,A6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...