【发布时间】:2015-12-13 20:25:08
【问题描述】:
这和我问的here很相似,只是只有两个文件,而且是反向搜索。
说明
鉴于这两个文件(test1.csv 和test2.csv 如下所示),我需要将来自test1.csv 的LoginNumber 与来自test2.csv 的UserIDNumber 匹配。
找到匹配项后,从test2.csv 中的ReportExpirationDate 列中获取值。
如果ReportExpirationDate 的值中没有任何内容,则应将值从$null 更改为User Not Found。
最后,在匹配LoginNumber 和UserIDNumber 时,我们需要在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