在特定列中将数据从一种CSV导入到另一种CSV

时间:2018-08-10 00:47:43

标签: powershell csv import import-csv

我无法从1个CSV复制数据并将其粘贴到另一个CSV模板中。 该模板具有特定的列名。 以及包含数据的csv文件,我可以获取每一列,但是将其粘贴到模板时遇到了麻烦。

我正在尝试将以下数据从1个csv复制到模板,这是列

email --> internal_customer_ID  
givenname --> first_name
surname --> last_name
mail --> email_address
mobilephone --> mobile_phone_1
officePhone --> landline_phone_1

这是我当前的代码。

#Clear Screen
CLS

#The path we are working with (use the path where we execute this script from)
$global:path = Split-Path $script:MyInvocation.MyCommand.Path

$DataFile = $path + "\dataFile.csv"
$ExportedFileCSV = $path + "\PopulatedTemplate.csv"

#Export the data file with our user info
Get-ADGroupMember -Identity SomeGroup | Get-ADUser -Properties * | Select-Object -Property GivenName, SurName, Mail, MobilePhone, OfficePhone | Export-Csv -path $DataFile -NoTypeInformation -Force

$dataInput = Import-Csv $DataFile
$dataOutput = Import-Csv $ExportedFileCSV

$dataInput | ForEach-Object {

    $newData = $_

    $dataOutput | 
    Add-Member -MemberType NoteProperty -Name "internal_customer_ID" -Value $newData.Mail -PassThru -Force|
    Add-Member -MemberType NoteProperty -Name "landline_phone_1" -Value $newData.OfficePhone -PassThru -Force|
    Add-Member -MemberType NoteProperty -Name "email_address" -Value $newData.Mail -PassThru -Force|
    Add-Member -MemberType NoteProperty -Name "mobile_phone_1" -Value $newData.MobilePhone -PassThru -Force|
    Add-Member -MemberType NoteProperty -Name "last_name" -Value $newData.SurName -PassThru -Force|
    Add-Member -MemberType NoteProperty -Name "first_name" -Value $newData.GivenName -PassThru -force

} | Export-CSV $ExportedFileCSV

如果我可以避免首先导出数据文件,而只是将结果附加到

Get-ADGroupMember -Identity SomeGroup | Get-ADUser -Properties * | Select-Object -Property GivenName, SurName, Mail, MobilePhone, OfficePhone

直接进入csv模板,这也可以满足我的需求,我只是不确定如何做到这一点。

1 个答案:

答案 0 :(得分:2)

我认为您的行读$dataOutput | Add-Member ...是个问题。 Add-Member用于将属性添加到单个对象,但是$dataOutput此时是对象的集合。我认为解释器认为您正在尝试将成员属性添加到对象数组。

尝试为每个输出记录创建一个新对象,然后对输出CSV文件执行Export-CSV -append

我认为类似的方法应该起作用:

$dataInput | ForEach-Object {

    $newData = $_
    $newRecordProperties = [ordered]@{
                    "internal_customer_ID"=$newData.Mail
                    "landline_phone_1" = $newData.OfficePhone 
                    "email_address" = $newData.Mail
                    "mobile_phone_1" = $newData.MobilePhone 
                    "last_name" = $newData.SurName
                    "first_name" = $newData.GivenName
                    }
    $newRecord = new-object psobject -Property $newRecordProperties
    Write-Output $newRecord

} | Export-CSV $ExportedFileCSV -Append

只要输出CSV中的列名与您的新记录对象相同,我认为就可以了。我不确定如果$ExportedFileCSV中的列与要导出的$newRecord的顺序不同,那么会发生什么情况,所以我在哈希表中添加了[ordered]。您可能要自己测试一下。

对于您的问题的第二部分,整个过程进行流水线处理,可能是您所追求的:

Get-ADGroupMember -Identity SomeGroup | 
    Get-ADUser -Properties * | 
    Select-Object -Property @(
        @{label="internal_customer_ID"; expression={$_.Mail}}
        @{label="email_address";        expression={$_.Mail}}
        @{label="landline_phone_1";     expression={$_.OfficePhone}}
        @{label="first_name";           expression={$_.GivenName}}
        @{label="last_name";            expression={$_.SurName}}
        @{label="mobile_phone_1";       expression={$_.MobilePhone}}
     ) |
    Export-Csv $ExportedFileCSV -Append
上面的

Select-Object创建了一个自定义对象,其属性名称和属性值与label和结果expression相匹配。再次,重新排序以匹配CSV列应位于的顺序。