Powershell - как игнорировать двойные строки при импорте csv

Wiktor Kostrzewski спросил: 13 июня 2018 в 12:05 в: powershell

Можно ли игнорировать строки, которые имеют одинаковое имя и фамилию при импорте данных из csv в PowerShell. Это способ игнорировать их, а не обновлять их в AD?

Я бы предпочел вместо этого получить сообщение


3 ответа

Есть решение
Theo ответил: 16 июня 2018 в 12:23

Я бы предложил добавить новое свойство импортированного csv, где каждый пользователь получает комбинацию First и Surname. С этого момента было бы легко пропустить те, у которых одинаковые полные имена. (обратите внимание, что я взял пример пользователя LotPings, чтобы убедиться, что он работает так, как ожидалось)

$csv = 'Name,Surname,ID
Stephen,Owen,1234
Lindey,Owen,2345
Stephen,Owen,3456
Pippin,Owen,4567
John,Elway,5678
Lindey,Elway,9876
John,Elway,5555'$users = $csv | ConvertFrom-Csv
# add a column with the first and lastnames combined
foreach ($user in $users) {
    $user | Add-Member -MemberType NoteProperty -Name 'FullName' -Value ("{0} {1}" -f $user.Name, $user.Surname)
}# now create an array with all users except those that have the same 'FullName'
$noDupes = @()
foreach ($user in $users) {
    If ($user.FullName -in $noDupes.FullName){
        Write-Warning "Skipping user $($user.FullName), ID $($user.ID), already processed"
        continue
    }
    "importing $($user.Name) $($User.SurName)"
    $noDupes += ($user)
}$noDupes

Будет выдано:

importing Stephen Owen
importing Lindey Owen
WARNING: Skipping user Stephen Owen, ID 3456, already processed
importing Pippin Owen
importing John Elway
importing Lindey Elway
WARNING: Skipping user John Elway, ID 5555, already processedName    Surname ID   FullName    
----    ------- --   --------    
Stephen Owen    1234 Stephen Owen
Lindey  Owen    2345 Lindey Owen 
Pippin  Owen    4567 Pippin Owen 
John    Elway   5678 John Elway  
Lindey  Elway   9876 Lindey Elway

Изменить

Если вы хотите пропустить всех пользователей, у которых есть дубликаты (а не только дубликаты), вы можете использовать что-то вроде этого:

$csv = 'Name,Surname,ID
Stephen,Owen,1234
Lindey,Owen,2345
Stephen,Owen,3456
Pippin,Owen,4567
John,Elway,5678
Lindey,Elway,9876
John,Elway,5555'$users = $csv | ConvertFrom-Csv
# add a column with the first and lastnames combined
foreach ($user in $users) {
    $user | Add-Member -MemberType NoteProperty -Name 'FullName' -Value ("{0} {1}" -f $user.Name, $user.Surname)
}# find all duplicate objects using the 'FullName'
$names = @()
$dupes = @()
foreach ($user in $users) {
    If (-not ($user.FullName -in $names)) {
        $names += ($user.FullName)
    }
    else {
        $dupes += $user.FullName
        Write-Warning "Duplicate user skipped: $($user.FullName)"
    }
}$users = ($users | Where-Object { $_.FullName -notin $dupes })$users

даст:

Name   Surname ID   FullName    
----   ------- --   --------    
Lindey Owen    2345 Lindey Owen 
Pippin Owen    4567 Pippin Owen 
Lindey Elway   9876 Lindey Elway
Wiktor Kostrzewski ответил: 15 июня 2018 в 05:07
И если я хочу игнорировать двойные и оригинальные записи?
Theo ответил: 16 июня 2018 в 12:24
Я отредактировал свой ответ и добавил новый код ниже, чтобы сделать именно это.
Wiktor Kostrzewski ответил: 16 июня 2018 в 05:46
Спасибо :) это очень полезно для изучения
FoxDeploy ответил: 15 июня 2018 в 11:49

Это определенно делает!

Сначала давайте предположим, что у вас есть стартовый список пользователей, таких как

$csv = 'Name,Surname,ID
Stephen,Owen,1234
Lindey,Owen,2345
Stephen,Owen,3456
Pippin,Owen,4567
John,Elway,5678'$users = $csv | ConvertFrom-Csv 

. Чтобы узнать, уже обработанный пользователь, нам потребуется способ отслеживания каждого пользователя при их обработке, поэтому мы будем добавлять каждого пользователя в ArrayList, когда мы обрабатываем их, например.

$processed = New-Object System.Collections.ArrayList
ForEach ($user in $users){
   #Do your processing here
    $null = $processed.Add($user)
}

Но нам еще нужна логика, чтобы проверить и посмотреть, работали ли мы с определенным пользователем раньше. Мы можем это сделать, проверив, есть ли $processed имя и сур. Имя, которые соответствуют $user, на котором мы работаем в данный момент.

ForEach ($record in $processed){
    if ($record.Name -eq $User.Name){
        If ($record.SurName -eq $User.SurName){
            Write-Warning "Skipping user $($user.Name) $($user.SurName), ID $($user.ID), already processed"
            continue #This Keyword skips this item and continues to the next in the list
        }
    }
}

Поместите все это вместе, и у вас есть это.

Готовый пример

$users = $csv | ConvertFrom-Csv 
$processed = New-Object System.Collections.ArrayList
ForEach ($user in $users){    
    ForEach ($record in $processed){
        if ($record.Name -eq $User.Name){
            If ($record.SurName -eq $User.SurName){
                Write-Warning "Skipping user $($user.Name) $($user.SurName), ID $($user.ID), already processed"
                continue
            }
        }
    }
    "importing $($user.Name) $($User.SurName)"
    $null = $processed.Add($user)
}

Что будет выводиться следующим образом (обратите внимание, что у меня есть две записи для "Stephen Owen" в списке)

importing Stephen Owen
importing Lindey Owen
WARNING: Skipping user Stephen Owen, ID 3456, already processed
importing Pippin Owen
importing John Elway
LotPings ответил: 13 июня 2018 в 03:41
Добавьте Lindey,Elway,9876 к вашему $ csv и посмотрите, что произойдет. Вы не можете самостоятельно проверить имя и фамилию.
Wiktor Kostrzewski ответил: 14 июня 2018 в 08:22
И если я хочу, чтобы они обновлялись из csv-файла?
Wiktor Kostrzewski ответил: 14 июня 2018 в 08:31
Должен ли я использовать этот метод? $ csv = get-content c: \ scripts \ computers.csv | выберите -Skip 1 | ConvertFrom-Csv -Header"Имя","Фамилия","Идентификатор"
LotPings ответил: 14 июня 2018 в 09:11
@WiktorKostrzewski Нет, как говорится в вашем названии, $Users = Import-Csv 'X:\path\users.csv'
Wiktor Kostrzewski ответил: 14 июня 2018 в 10:42
хорошо, спасибо за это! :)
WarTech ответил: 14 июня 2018 в 12:16

Или вы можете использовать Sort -Unique:

$users | Select-Object -Property @{ Name = "FullName"; Expression = { $_.Name + $_.Surname }}, Name, Surname, ID | Sort-Object FullName -Unique

, хотя это не дает вам знать, что пользователи были удалены.

Дополнительное видео по вопросу: Powershell - как игнорировать двойные строки при импорте csv

Creating AD Users from CSV with Powershell | InstructorPaul.com

Powershell Using Import-CSV with New-Aduser to create multiple users

Easy Import CSV Users into Active Directory