【问题标题】:Combine data from 2 CSV files into 1 new CSV using Powershell使用 Powershell 将 2 个 CSV 文件中的数据合并为 1 个新的 CSV
【发布时间】:2016-10-10 18:46:22
【问题描述】:

***为清晰而编辑:

我的 ADP CSV 包含与所列完全一致的这些标题:操作日期、工作信息生效日期、位置名称、法定姓名、员工状态代码、名字、姓氏、员工 ID、职位、位置状态、位置城市、员工班级、雇用日期、工作终止日期、FLSA 加班指示器、FLSA 状态。

我的 Office 365 CSV 包含与所列完全一致的这些标题:显示名称、电子邮件地址

我需要一个 CSV,其中列出:显示名称、电子邮件地址、城市、州、位置名称、职位。

我需要一个 Powershell 脚本,将这两个文件组合在一起,让我只剩下 Office 365 用户和他们的个人资料丢失的数据,例如城市、州、位置名称、职位。

我了解为 Office 365 列表创建哈希表,但每次创建它都会返回“数组索引评估为 Null”,这意味着我没有在哈希表中使用正确的标题名称。

****再次编辑!我附上我的代码。除了它创建的电子邮件列是空白的之外,它可以完成我需要的所有操作。我不再遇到 hast table 错误。

    $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

【问题讨论】:

    标签: powershell csv


    【解决方案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
    

    【讨论】:

    • 你太棒了!这极大地帮助了我的公司。但是,它在尝试创建哈希表时返回错误“数组索引评估为 Null”。此外,当我从 ADP 运行我的列表以及从 Office 365 运行另一个列表时,标题中没有下划线。在我运行我的代码之前,我没有得到下划线,因此只要代码使用两个原始列表而不是我修改后的 ADP csv,我们就可以从中删除替换步骤。标题是:
    • Office 365 列表 - 显示名称、电子邮件地址(但是由于某种原因,当我导出它时,它会放置大约 30 个空格和电子邮件地址的结尾,但我可以手动删除这些并保存文件)
    • @BrandonCrimmins 在构建哈希表时忘记了属性名称周围的引号,更新了答案
    • ADP 文件:行动日期、职位信息生效日期、位置名称、法定姓名、员工状态代码、名字、姓氏、员工 ID、职位、位置状态、位置城市、员工类别、雇用日期、工作终止日期、FLSA 加班指示器、FLSA 状态。它不包含显示名称,我正在为使用名字和姓氏的两个文件的匹配条件创建它。我需要将活跃用户从 ADP 列表中删除,包括他们的州、位置名称、位置城市和职位。我需要从 Office 365 添加他们的电子邮件地址。
    • 我的最终 CSV 应该只包含 Office 365 列表中的用户,因为他们是唯一具有当前电子邮件地址的用户。其他所有人都可以被排除在外,因为他们不需要在我们的 AD 中。我不能告诉你我是多么感激这一点!您正在帮助一家小型企业大幅改善其日常工作的一部分。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2017-12-19
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多