【问题标题】:Powershell - How to ignore double rows while importing csvPowershell - 如何在导入 csv 时忽略双行
【发布时间】:2018-07-08 01:45:29
【问题描述】:

在 PowerShell 中从 csv 导入数据时,是否可以忽略具有相同名称和姓氏的行。这是一种忽略它们而不是在 AD 中更新它们的方法吗?

我更愿意收到消息

【问题讨论】:

    标签: powershell csv active-directory


    【解决方案1】:

    这绝对是可行的!

    首先,假设您有一个这样的用户起始列表

    $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 匹配的 Name 和 SurName 来做到这一点。

    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
    

    【讨论】:

    • Lindey,Elway,9876 添加到您的 $csv 中,看看会发生什么。您不能单独检查姓名和姓氏。
    • 我应该使用这种方法吗? $csv = 获取内容 c:\scripts\computers.csv |选择 - 跳过 1 | ConvertFrom-Csv -Header "Name","Surname","ID"
    • @WiktorKostrzewski 不,正如你的标题所说,$Users = Import-Csv 'X:\path\users.csv'
    • 所以在这个循环结束时,我应该用 -Replace $processed 参数设置-aduser。很抱歉问我仍在尝试找出 PowerShell :)
    • 好点,@LotPings,我已经更新了我的示例来解决这个问题。
    【解决方案2】:

    我建议在导入的 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 processed
    
    Name    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
    

    【讨论】:

    • 如果我想忽略双重和原始条目?
    • 我已经编辑了我的答案并在下面添加了新代码来做到这一点。
    【解决方案3】:

    或者你可以使用 Sort -Unique:

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

    虽然这不会让您知道用户已被删除。

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      相关资源
      最近更新 更多