在 2 个 CSV 文件之间的新列中查找匹配项并添加值
Find Match and Add values in new column between 2 CSV files
这和我问的非常相似,只是只有两个文件,而且是反向搜索。
说明
给定两个文件(如下所示的 test1.csv
和 test2.csv
),我需要将 test1.csv
中的 LoginNumber
与 UserIDNumber
中的 UserIDNumber
相匹配15=].
找到匹配项后,从 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
中,因此它们不能用作哈希表的键。不过,用户 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
这和我问的
说明
给定两个文件(如下所示的 test1.csv
和 test2.csv
),我需要将 test1.csv
中的 LoginNumber
与 UserIDNumber
中的 UserIDNumber
相匹配15=].
找到匹配项后,从 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
中,因此它们不能用作哈希表的键。不过,用户 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