【问题标题】:Find Match and Add values in new column between 2 CSV files在 2 个 CSV 文件之间的新列中查找匹配和添加值
【发布时间】:2015-12-13 20:25:08
【问题描述】:

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

说明

鉴于这两个文件(test1.csvtest2.csv 如下所示),我需要将来自test1.csvLoginNumber 与来自test2.csvUserIDNumber 匹配。

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

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

最后,在匹配LoginNumberUserIDNumber 时,我们需要在test1.csv 后面附加一个ExpirationDateFromReport 列。

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

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 中有 2 条登录号为空的记录。你想如何处理它们?此外,test2.csv 中的 AccountDescriptionDetails 不是唯一的,因此您不能将其用作哈希表中的键。 UserIDNumber 列中的值也不是唯一的,因此您也不能将其用作键。如果您没有独特的属性,您如何期望获得独特的关联?
  • 如果test1.csv中没有LoginNumber,那么ExpirationDateFromReport的值应该是User Not Found。另外,如果LoginNumber不在test2.csv中,在文件test1.csv中,那么ExpirationDateFromReport的值应该还是User Not Found
  • 如果test2.csv 中的给定用户 ID 有两行(或多行)怎么办?
  • test2.csv 中不应有重复的UserIDNumber。在 test2.csv 中,UserIDNumber 也没有空白值。它们在 test2.csv 中都是唯一的
  • 嗯,有。至少在你的例子中。不反映您的实际数据的示例数据是无用的。

标签: csv powershell powershell-3.0


【解决方案1】:

帐户描述不是唯一的,也不存在于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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多