как я могу исправить согласование файлов .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.