如何从一个 csv 文件中获取值并将它们插入单独的 csv 文件中的特定位置

How to grab values from one csv file and plug them into specific places in separate csv file

我将在这里解释我想做的事情。然后分享我到目前为止的尝试...

我有 2 个 csv 文件....

CSV 文件 1 (ContractorDomain.csv) 看起来像这样...

"SamAccountName","FirstName","LastName"
"2v2390s"       ,"Jr.,John" ,"Doe"
"4gsi2f2"       ,"Peter"    ,"Pan"
"asdfds9"       ,"Leo"      ,"Turtle"
"2fsa02f"       ,"Chuck"    ,"Findly"
"4gas5a3"       ,"Stan"     ,"Garcia"
"1asfd32"       ,"Linsey"   ,"Silver"

我只对获取列 SamAccountName

感兴趣

现在 csv 文件 2 (employeeList.csv) 看起来像这样...

"DomainNamesFromAD"
"PermDomain"
"PermDomain"
"PermDomain"
"PermDomain"
"ContractorDomain"
"ContractorDomain"
"ContractorDomain"
"ContractorDomain"
"ContractorDomain"
"ContractorDomain"

最终目标是使 csv 文件 2 (employeeList.csv) 看起来像这样...

"DomainNamesFromAD","SamAccountNameFromAD"
"PermDomain"
"PermDomain"
"PermDomain"
"PermDomain"
"ContractorDomain","2v2390s"
"ContractorDomain","4gsi2f2"
"ContractorDomain","asdfds9"
"ContractorDomain","2fsa02f"
"ContractorDomain","4gas5a3"
"ContractorDomain","1asfd32"

到目前为止我已经尝试过...

我觉得我快到了,但我需要一点帮助。这是我的代码...

$ContractorSamAccountNames = Import-Csv ContractorDomain.csv | 
    Select-Object -Expand SamAccountName

$csvFormatContractorSamAccountNames = $ContractorSamAccountNames | Select-Object @{Name='SamAccountName';Expression={$_}}

现在,如果我将 $csvFormatContractorSamAccountNames 导出到 csv 文件,它会显示正确的列和值。所以我知道我得到了价值。现在这里是我尝试将它们插入文件 2 的地方...

Import-Csv employeeList.csv | 
    Select-Object -Property *, @{n='SamAccountNameFromAD';e={
    if ($_.DomainNamesFromAD -eq "ContractorDomain") {"Found"}}} |
    Export-Csv "employeeListTemp.csv" -NoTypeInformation

我在 csv 文件 2 (employeeList.csv) 中选择了正确的行。但是,我需要以某种方式将 "Found" 替换为 $csvFormatContractorSamAccountNames 中的值(也许使用 for 循环?)。

我也试过这个:

$num = 0
Import-Csv employeeList.csv | 
    Select-Object -Property *, @{n='SamAccountNameFromAD';e={
    if ($_.DomainNamesFromAD -eq "ContractorDomain") 
    {
        $ContractorSamAccountNames[$num]
        $num++
    }}} |
    Export-Csv "employeeListTemp.csv" -NoTypeInformation

但这只填充了数组的第一个值$ContractorSamAccountNames。换句话说,该文件如下所示...

"DomainNamesFromAD","SamAccountNameFromAD"
"PermDomain"
"PermDomain"
"PermDomain"
"PermDomain"
"ContractorDomain","2v2390s"
"ContractorDomain","2v2390s"
"ContractorDomain","2v2390s"
"ContractorDomain","2v2390s"
"ContractorDomain","2v2390s"
"ContractorDomain","2v2390s"

我不确定为什么 $num++ 不递增。非常感谢任何可以提供帮助的人。我已经在这里待了 5 个小时...

当导入文件的文件名中包含域名时,为什么要加入两个 csv 文件。我用两个导入文件做了测试...

CSV 文件 1 (ContractorDomain.csv) 喜欢你的

CSV 文件 2 (PermDomain.csv)

"SamAccountName","FirstName","LastName"
"JCarter"       ,"Jimmy"    ,"Carter"
"RReagan"       ,"Ronald"   ,"Reagan"
"GBush"         ,"George"   ,"Bush"
"BClinton"      ,"Bill"     ,"Clinton"
"GWBush"        ,"George W.","Bush"
"BObama"        ,"Barack"   ,"Obama"

剧本..

$Local:SourceFilesPathes = @("C:\temp\whosebug.com_34245941\ContractorDomain.csv", "C:\temp\whosebug.com_34245941\PermDomain.csv")

$Local:OutFilePath       = "C:\temp\whosebug.com_34245941\employeeList.csv"
$Local:OutFileObjectList = @()

$SourceFilesPathes | ForEach-Object {
    $Current_SourceFilePath = $_

    if ( (Test-Path -Path $Current_SourceFilePath -PathType leaf) ) {
        $Local:Current_DomainName         = (Get-Item  -Path $Current_SourceFilePath).BaseName   # Domain name from file name
        $Local:Current_SourceFileContent  = Import-Csv -Path $Current_SourceFilePath -Delimiter ","

        $Current_SourceFileContent.ForEach({
            $Local:Current_OutFileEntryObject = New-Object -TypeName System.Management.Automation.PSObject
            $Current_OutFileEntryObject | Add-Member -MemberType "NoteProperty" -Name "DomainNamesFromAD"    -Value $Current_DomainName
            $Current_OutFileEntryObject | Add-Member -MemberType "NoteProperty" -Name "SamAccountNameFromAD" -Value ($_.SamAccountName)
            $OutFileObjectList += $Current_OutFileEntryObject
        })
    }
}

# Select-Object to order the properties inside CSV.  From left "DomainNamesFromAD", "SamAccountNameFromAD"
# Sort-Object to order the entries
$OutFileObjectList | Select-Object -Property DomainNamesFromAD, SamAccountNameFromAD | Sort-Object -Property DomainNamesFromAD, SamAccountNameFromAD | Export-Csv -Path $OutFilePath -Delimiter "," -Force -NoTypeInformation

输出文件...

"DomainNamesFromAD","SamAccountNameFromAD"
"ContractorDomain","1asfd32"
"ContractorDomain","2fsa02f"
"ContractorDomain","2v2390s"
"ContractorDomain","4gas5a3"
"ContractorDomain","4gsi2f2"
"ContractorDomain","asdfds9"
"PermDomain","BClinton"
"PermDomain","BObama"
"PermDomain","GBush"
"PermDomain","GWBush"
"PermDomain","JCarter"
"PermDomain","RReagan"

我找到了...

$ContractorSamAccountNames = Import-Csv ContractorDomain.csv | 
    Select-Object -Expand SamAccountName

$script:numOfContractorSamAccountNames = 0
Import-Csv employeeList.csv | 
    Select-Object -Property *, @{n='SamAccountNameFromAD';e={
    if ($_.DomainNamesFromAD -eq "ContractorDomain") {$ContractorSamAccountNames[$script:numOfContractorSamAccountNames];$script:numOfContractorSamAccountNames++}}} |
Export-Csv "employeeListTemp.csv" -NoTypeInformation

这是您的解决方案...

$ContractorSamAccountNames = Import-Csv  "C:\temp\whosebug.com_34245941\ContractorDomain.csv" | Select-Object -Property SamAccountName
$i = 0

@(Import-Csv "C:\temp\whosebug.com_34245941\employeeList.csv" -Delimiter ",").ForEach({
    if ($_.DomainNamesFromAD -eq "ContractorDomain") {
        $_ | Add-Member -MemberType "NoteProperty" -Name "SamAccountNameFromAD" -Value ($ContractorSamAccountNames[$i++].SamAccountName) -Force
    }
    $_
})) | Export-Csv -Path "C:\temp\whosebug.com_34245941\employeeList.csv" -Delimiter "," -Force -NoTypeInformation

我试过你的例子以“$num = 0”开头。关键是在 运行 脚本之后 $num 仍然是 0。换句话说:没有 foreach 循环就没有办法。

另一个问题是您需要为两个文件中的每个域添加完全相同数量的条目。