在 2 个 CSV 文件之间的新列中查找匹配项并添加值

Find Match and Add values in new column between 2 CSV files

这和我问的非常相似,只是只有两个文件,而且是反向搜索。

说明

给定两个文件(如下所示的 test1.csvtest2.csv),我需要将 test1.csv 中的 LoginNumberUserIDNumber 中的 UserIDNumber 相匹配15=].

找到匹配项后,从 test2.csv 中的 ReportExpirationDate 列获取值。

如果 ReportExpirationDate 的值中没有任何内容,则应将值从 $null 更改为 User Not Found

最后,我们需要在匹配 LoginNumberUserIDNumber 时附加 test1.csvExpirationDateFromReport

注意:我在这个问题的列之间添加了空格,以便更容易看到和查看我在说什么。文件没有空格...

test1.csv:

"SamAccountName","LoginNumber","Type,"ContractorDomain","ExpirationDateFromAd"
"jd12395"       ,"0031482"    ,"H"  ,"P12345"          ,"2016/06/26 13:59"
"jwet"          ,""           ,"P"  ,"A52671"          ,""
"x023js"        ,"0418230"    ,"P"  ,""                ,""
"1b3gas5"       ,"2167312"    ,"H"  ,"425126"          ,"2015/11/17 12:00"
"632g1fsa"      ,"0052142"    ,"L"  ,""                ,""
"x023js"        ,"0720182"    ,"P"  ,""                ,"2016/06/26 13:59"
"4126hs"        ,""           ,"H"  ,""                ,"2016/08/12 4:32"
"axv"           ,"2058194"    ,"A"  ,"L21514"          ,"2016/03/11 7:31"

test2.csv:

UserIDNumber,AccountDescriptionDetails,ReportExpirationDate
0052142     ,Company CEO              ,
0418230     ,Software Developer       ,20161124
0031482     ,Software Developer       ,
2167312     ,Project Manager          ,20151117
0720182     ,QA Tester                ,20160128
1840237     ,Accountant Administrator ,
0000418     ,Program Manager          ,20160309

test1.csv 的最终结果应该是这样的:

"SamAccountName","LoginNumber","Type,"ContractorDomain","ExpirationDateFromAd","ExpirationDateFromReport"
"jd12395"       ,"0031482"    ,"H"  ,"P12345"          ,"2016/06/26 13:59"    ,""
"jwet"          ,""           ,"P"  ,"A52671"          ,""                    ,""
"x023js"        ,"0418230"    ,"P"  ,""                ,""                    ,"20161124"
"1b3gas5"       ,"2167312"    ,"H"  ,"425126"          ,"2015/11/17 12:00"    ,"20151117"
"632g1fsa"      ,"0052142"    ,"L"  ,""                ,""                    ,""
"x023js"        ,"0720182"    ,"P"  ,""                ,"2016/06/26 13:59"    ,"20160128"
"4126hs"        ,""           ,"H"  ,""                ,"2016/08/12 4:32"     ,""
"axv"           ,"2058194"    ,"A"  ,"L21514"          ,"2016/03/11 7:31"     ,""

到目前为止我尝试了什么...

$logins = Import-Csv 'C:\Temp\test1.csv' |
          Select-Object -Expand LoginNumber

$accountStatus = @{}
Import-Csv 'C:\Temp\test2.csv' | Where-Object {
  $logins -contains $_.UserIDNumber
} | ForEach-Object {
  $accountStatus[$_.AccountDescriptionDetails] = $_.ReportExpirationDate
}

(Import-Csv 'C:\Temp\test1.csv') |
  Select-Object -Property *, @{n='ExpirationDateFromReport';e={
    if ($accountStatus.ContainsKey($_.AccountDescriptionDetails)) {
      $accountStatus[$_.AccountDescriptionDetails]
    } else {
      'User Match Not Found'
    }
  }} | Export-Csv 'C:\Temp\final.csv' -NoType

由于某种原因,附加列的所有值都是空白。

帐户描述不是唯一的,也不存在于 test1.csv 中,因此它们不能用作哈希表的键。不过,用户 ID 会起作用。

$accountStatus = @{}
Import-Csv 'C:\Temp\test2.csv' | ForEach-Object {
  $accountStatus[$_.UserIDNumber] = $_.ReportExpirationDate
}

使用 if 语句处理空报告到期日期:

Import-Csv 'C:\Temp\test2.csv' | ForEach-Object {
  $accountStatus[$_.UserIDNumber] = if ($_.ReportExpirationDate) {
    $_.ReportExpirationDate
  } else {
    'No Date Found'
  }
}

然后将新列添加到 test1.csv:

Import-Csv 'C:\Temp\test1.csv' |
  Select-Object -Property *, @{n='ExpirationDateFromReport';e={
    if ($accountStatus.ContainsKey($_.LoginNumber)) {
      $accountStatus[$_.LoginNumber]
    } else {
      'User Match Not Found'
    }
  }} | Export-Csv 'C:\Temp\final.csv' -NoType