как я могу исправить согласование файлов .csv, чтобы удалить дубликаты/пустые значения

Я использовал код из этого ответа для проверки дополнений/изменений в списках классов из MS Teams:

      $set = [System.Collections.Generic.HashSet[string]]::new(
    [string[]] (Import-CSV -Path stundent.csv).UserPrincipalName,
    [System.StringComparer]::InvariantCultureIgnoreCase
)
Import-Csv ad.csv | Where-Object { $set.Add($_.UserPrincipalName) } |
    Export-Csv path\to\output.csv -NoTypeInformation

В идеале я хочу иметь возможность проверить, были ли удаления по сравнению с новым файлом, поменять местами позиции файла импорта и проверить наличие добавлений. Если мои файлы выглядят как Source1 и Source2 (ниже), проверка на удаление вернет Export1, а проверка на добавление вернет Export2. Поскольку будет несколько экземпляров учащихся в нескольких классах, я хочу включить TeamDesc в запрос фильтра, чтобы убедиться, что возвращается только конкретный экземпляр этого ученика с этим классом.

Source1.csv

2 ответа

Предполагая, что оба Csv хранятся в памяти,Source1.csvявляется$csv1иSource2.csvу вас уже есть логика дляExport2.csvиспользуя:

      $set = [System.Collections.Generic.HashSet[string]]::new(
    [string[]] $csv1.UserPrincipalName,
    [System.StringComparer]::InvariantCultureIgnoreCase
)
$csv2 | Where-Object { $set.Add($_.UserPrincipalName) }

Выходы:

      TeamDesc UserPrincipalName   Name
-------- -----------------   ----
Team 2   student4@domain.com tim tams

Для первого требования,Export1.csv, ссылочный объект будет$csv2и вместоHashSet<T>вы можете использовать хеш-таблицу ,Group-Object -AsHashTableделает это действительно легко в этом случае:

      $map = $csv2 | Group-Object UserPrincipalName -AsHashTable -AsString

# if Csv2 has unique values for `UserPrincipalName`
$csv1 | Where-Object { $map[$_.UserPrincipalName].TeamDesc -ne $_.TeamDesc }

# if Csv2 has duplicated values for `UserPrincipalName`
$csv1 | Where-Object { $_.TeamDesc -notin $map[$_.UserPrincipalName].TeamDesc }

Выходы:

      TeamDesc UserPrincipalName   Name
-------- -----------------   ----
Team 1   student1@domain.com john smith

Используя это Join-Object script/ Join-Object Module(см. также: Как сравнить два файла CSV и вывести строки, которые есть только в одном из файлов, но не в обоих, и в Powershell, как лучше всего объединить две таблицы в одну?):

Загрузка ваших образцов данных:
(В вашем случае вы, вероятно, захотите использовать Import-Csvдля импорта ваших данных)

      Install-Script -Name Read-HtmlTable
$Csv1 = Read-HtmlTable https://stackoverflow.com/q/74452725 -Table 0 # Import-Csv .\Source1.csv
$Csv2 = Read-HtmlTable https://stackoverflow.com/q/74452725 -Table 1 # Import-Csv .\Source2.csv
      Install-Module -Name JoinModule
$Csv1 |OuterJoin $Csv2 -On TeamDesc, UserPrincipalName -Name Out,In

TeamDesc UserPrincipalName   OutName    InName
-------- -----------------   -------    ------
Team 1   student1@domain.com john smith
Team 2   student4@domain.com            tim tams

Вы можете использовать (один) файл результатов как есть. Если вы действительно хотите работать с двумя разными файлами, вы можете разделить результаты, как в хорошем ответе от user45375.

Другие вопросы по тегам