#powershell #csv
#powershell #csv
Вопрос:
*** ОТРЕДАКТИРОВАНО ДЛЯ НАГЛЯДНОСТИ:
Мой ADP CSV содержит эти заголовки точно так, как указано: дата действия, дата вступления в силу сведений о работе, название местоположения, юридическое название, код статуса сотрудника, имя, фамилия, идентификатор сотрудника, должность, штат местоположения, город местоположения, класс сотрудника, дата найма, дата окончания работы, срок действия FLSAИндикатор, статус FLSA.
Мой CSV-файл Office 365 содержит эти заголовки точно так, как указано в списке: ОТОБРАЖАЕМОЕ ИМЯ, АДРЕС электронной ПОЧТЫ
Мне нужен CSV, в котором перечислены: отображаемое имя, адрес электронной почты, город, штат, название местоположения, должность.
Мне нужен сценарий Powershell, который объединяет два файла вместе, чтобы оставить мне только пользователей Office 365 и данные, которые отсутствуют в их профиле, такие как город, штат, название местоположения, должность.
Я понимаю, что создаю хэш-таблицу для списка Office 365, но каждый раз, когда я ее создаю, она возвращает «индекс массива, равный нулю», что, в моем понимании, означает, что я не использую правильные имена заголовков в хэш-таблице.
**** Отредактировано ЕЩЕ РАЗ! Я прилагаю свой код. Он делает все, что мне нужно, за исключением того, что столбец электронной почты, который он создает, является пустым. Я больше не получаю ошибок в таблице hast.
$ItemsToKeep = 'First Name','Last Name','Employee Status Code','Location Name','Job Title','Location State'
$ItemsToKeep = @{Name = "Display Name"; Expression = {$_.'First Name' ' ' $_.'Last Name'}}
$ItemsToKeep = @{Name = "Email"; Expression = { $EmailLookupTable[$_.'Display Name'] }}
$EmailLookupTable = @{}
Import-Csv C:O365LIST.csv |ForEach-Object {
$EmailLookupTable[$_.'Display Name'] = $_.'Email Address'
}
Import-Csv C:ADPLIST.csv |Where-Object {$_.'Employee Status Code' -eq 'Active'} | Select $ItemsToKeep | export-csv C:Testing.csv -notypeinformation
Ответ №1:
Сначала загрузите второй CSV-файл в хеш-таблицу, таким образом, вы можете легко сопоставить отображаемое имя из первого CSV-файла с адресом электронной почты:
#Import the second CSV and use a hashtable to store the email address based on the display name
$EmailLookupTable = @{}
Import-Csv C:employee_emails.csv |ForEach-Object {
$EmailLookupTable[$_.'Display Name'] = $_.'Email Address'
}
С помощью существующего скрипта вместо экспорта в новый файл между каждой операцией соедините их все вместе в одном конвейере — большая часть кода может быть автоматизирована с помощью небольшого метапрограммирования!
# Automate away the task of replacing spaces with underscores
$ColumnsToKeep = "Location Name","Employee Status Code","Job Title","Location State","Location City","First Name","Last Name"
$PropertiesToSelect = $ColumnsToKeep |ForEach-Object {
@{Name = $_ -replace ' ','_'; Expression = [scriptblock]::Create('$_."{0}"' -f $_)}
}
# Add the display name property
$PropertiesToAdd = @(@{Name = "Display_Name"; Expression = {$_.First_Name ' ' $_.Last_Name}})
# Add the Email address from the lookup table
$PropertiesToAdd = @{Name = "Email"; Expression = { $EmailLookupTable[$_.First_Name ' ' $_.Last_Name] }}
# 1. Import CSV
# 2. Filter on status
# 3. Select the properties to keep/rename
# 4. Select the properties from the previous step the new ones
# 5. Export CSV
Import-Csv C:ADPLIST.csv |Where-Object {$_.'Employee Status Code' -eq 'Active'} |Select-Object $PropertiesToSelect |Select-Object *,$PropertiesToAdd |Export-Csv C:final.csv
Комментарии:
1. Вы потрясающие! Это очень помогает моей компании. Как бы то ни было, при попытке создать хэш-таблицу возвращается ошибка «Индекс массива, равный нулю». Кроме того, когда я запускаю свой список из ADP, а другой список из Office 365, в заголовках нет подчеркиваний. Я не получал подчеркивания, пока не запустил свой код, чтобы мы могли удалить шаг замены из этого, если в коде используются два исходных списка, а не мой модифицированный ADP csv. Заголовки:
2. Список Office 365 — ОТОБРАЖАЕМОЕ ИМЯ, АДРЕС электронной почты (однако по какой-то причине, когда я его экспортирую, он содержит около 30 пробелов и конец АДРЕСА электронной почты, но я могу удалить их вручную и сохранить файл)
3. @BrandonCrimmins забыл кавычки вокруг имени свойства при создании хеш-таблицы, обновил ответ
4. ФАЙЛ ADP: дата действия, дата вступления в силу сведений о работе, название местоположения, юридическое название, код статуса сотрудника, имя, фамилия, идентификатор сотрудника, должность, штат местоположения, город местоположения, класс сотрудника, дата найма, дата окончания работы, индикатор времени выполнения FLSA, статус FLSA. Он не содержит отображаемого имени, я создаю его для соответствия критериям для обоих файлов, используя имя и фамилию. Мне нужно удалить активных пользователей из списка ADP с указанием их состояния, названия местоположения, города местоположения и должности. Мне нужно добавить их адрес электронной почты из Office 365.
5. Мой окончательный CSV-файл должен содержать только пользователей из списка Office 365, поскольку они единственные, у кого есть текущий адрес электронной почты. Все остальные могут быть исключены, поскольку они не должны быть в нашем объявлении. Я не могу выразить вам, насколько я это ценю! Вы помогаете малому бизнесу значительно улучшить часть своей рутины. Спасибо!