如何在多个 CSV 文件中比较、匹配和追加多个值?
How to compare, match, and append multiple values in multiple CSV files?
我正在尝试找到执行此操作的最佳方法,但我不确定如何通过同一管道 Import-Csv
使用 2 个不同的文件并导出找到的值...
所以让我们从 CSV 文件 1 开始:我只想要 LoginNumber
的值,其中 Type = H and (ContractorDomain -ne $null -or ContractorDomain -ne "")
。例如,这应该只从下面提取值 0031482
和 2167312
。
注意:我只添加了空格和箭头,以便于在此处作为列阅读。 csv 文件在列值或箭头之间没有空格。
"LoginNumber","Type","ContractorDomain"
"0031482" ,"H" ,"P12345" <<
"1251632" ,"P" ,"A52671"
"2167312" ,"H" ,"425126" <<
"0598217" ,"L" ,""
"1405735" ,"H" ,""
"2058194" ,"A" ,"L21514"
当找到 LoginNumber
的值编号(基于上述条件)时,在 CSV 文件 2 中搜索它。然后获取 AccountStatus
和 SamAccountName
的值UserIDNumber
.
各自的值
"SamAccountName","UserIDNumber","AccountDescriptionDetails","AccountStatus"
"jd12395" ,"0052142" ,"Company CEO" ,"Enabled"
"jwet" ,"2167312" ,"Software Developer" ,"Disabled" <<
"1b3gas5" ,"1385293" ,"Project Manager" ,"Disabled"
"632g1fsa" ,"0031482" ,"QA Tester" ,"Enabled" <<
"4126hs" ,"0000418" ,"Program Manager" ,"Disabled"
"axv" ,"1840237" ,"Accountant Administrator" ,"Disabled"
对于第 3 个 CSV 文件,我们有以下内容:
"domainName","SameAccountName","DateExpired"
"TempDomain","jwet" ,"20151230" <<
"PermDomain","p21942" ,""
"PermDomain","qz231034" ,""
"TempDomain","632g1fsa" ,"20151231" <<
"TempDomain","ru20da2bb22" ,"20160425"
接下来,对于第 3 个文件,我想添加列以插入 Disabled
和 Enabled
值(或 User Match Not Found
值):
"domainName","SameAccountName","DateExpired","UserStatus"
"TempDomain","jwet" ,"20151230" ,"Disabled" <<
"PermDomain","p21942" ,"" ,"User Match Not Found"
"PermDomain","qz231034" ,"" ,"User Match Not Found"
"TempDomain","632g1fsa" ,"20151231" ,"Enabled" <<
"TempDomain","ru20da2bb22" ,"20160425" ,"User Match Not Found"
我学会了如何导入 csv 并使用类似这样的东西创建新列...
Import-Csv $file | Select-Object -Property *, @{Name="UserStatus";Expression={
if ($true) {"fill value in here"}
}} | Export-Csv $newFile -NoType
所以我在想这样的事情。我只是不确定如何通过管道 search/find/pass 多个 CSV 文件值。
注意:其中一些 CSV 文件在我们要搜索的列前后有大约 15 列。此外,一些列值有一个逗号,所以我不能真正依赖 -Delimiter ,
。此外,某些列值没有 "
(如果您以 txt 格式打开 CSV)。
如果值被正确引用(即如果 CSV 有效),包含逗号的列应该不是问题。 Import-Csv
将正确导入记录 42,"a,b",c
作为三个值 42
、a,b
和 c
。如果您的 CSV 格式不正确:请先修复它。
从第一个 CSV 文件中获取登录 ID:
$logins = Import-Csv 'C:\path\to\file1.csv' |
Where-Object { $_.Type -eq 'H' -and $_.ContractorDomain } |
Select-Object -Expand LoginNumber
您可以将 ContractorDomain
属性 检查简化为 $_.ContractorDomain
,因为 PowerShell 在该上下文中解释空字符串和 $null
as a boolean value $false
。其他零值或空值(0、0.0、空数组等)也会发生同样的情况,但这在您的场景中应该不是问题。
接下来创建一个 hashtable 将帐户名称映射到它们各自的状态。通过您之前创建的 ID 列表过滤导入的第二个 CSV,因此哈希表仅包含相关映射。
$accountStatus = @{}
Import-Csv 'C:\path\to\file2.csv' | Where-Object {
$logins -contains $_.UserIDNumber
} | ForEach-Object {
$accountStatus[$_.SamAccountName] = $_.AccountStatus
}
使用该哈希表,您现在可以将 UserStatus
列添加到您的第三个 CSV 文件中:
(Import-Csv 'C:\path\to\file3.csv') |
Select-Object -Property *, @{n='UserStatus';e={
if ($accountStatus.ContainsKey($_.SameAccountName)) {
$accountStatus[$_.SameAccountName]
} else {
'User Match Not Found'
}
}} | Export-Csv 'C:\path\to\file3.csv' -NoType
Import-Csv
语句两边的括号确保文件在 Export-Csv
开始写入之前被完全读取并关闭。仅当您将修改后的数据写回同一个文件时才需要它们,否则可以省略。星号选择所有导入的列,附加的 calculated property 添加您要包含的新列。
我正在尝试找到执行此操作的最佳方法,但我不确定如何通过同一管道 Import-Csv
使用 2 个不同的文件并导出找到的值...
所以让我们从 CSV 文件 1 开始:我只想要 LoginNumber
的值,其中 Type = H and (ContractorDomain -ne $null -or ContractorDomain -ne "")
。例如,这应该只从下面提取值 0031482
和 2167312
。
注意:我只添加了空格和箭头,以便于在此处作为列阅读。 csv 文件在列值或箭头之间没有空格。
"LoginNumber","Type","ContractorDomain"
"0031482" ,"H" ,"P12345" <<
"1251632" ,"P" ,"A52671"
"2167312" ,"H" ,"425126" <<
"0598217" ,"L" ,""
"1405735" ,"H" ,""
"2058194" ,"A" ,"L21514"
当找到 LoginNumber
的值编号(基于上述条件)时,在 CSV 文件 2 中搜索它。然后获取 AccountStatus
和 SamAccountName
的值UserIDNumber
.
"SamAccountName","UserIDNumber","AccountDescriptionDetails","AccountStatus"
"jd12395" ,"0052142" ,"Company CEO" ,"Enabled"
"jwet" ,"2167312" ,"Software Developer" ,"Disabled" <<
"1b3gas5" ,"1385293" ,"Project Manager" ,"Disabled"
"632g1fsa" ,"0031482" ,"QA Tester" ,"Enabled" <<
"4126hs" ,"0000418" ,"Program Manager" ,"Disabled"
"axv" ,"1840237" ,"Accountant Administrator" ,"Disabled"
对于第 3 个 CSV 文件,我们有以下内容:
"domainName","SameAccountName","DateExpired"
"TempDomain","jwet" ,"20151230" <<
"PermDomain","p21942" ,""
"PermDomain","qz231034" ,""
"TempDomain","632g1fsa" ,"20151231" <<
"TempDomain","ru20da2bb22" ,"20160425"
接下来,对于第 3 个文件,我想添加列以插入 Disabled
和 Enabled
值(或 User Match Not Found
值):
"domainName","SameAccountName","DateExpired","UserStatus"
"TempDomain","jwet" ,"20151230" ,"Disabled" <<
"PermDomain","p21942" ,"" ,"User Match Not Found"
"PermDomain","qz231034" ,"" ,"User Match Not Found"
"TempDomain","632g1fsa" ,"20151231" ,"Enabled" <<
"TempDomain","ru20da2bb22" ,"20160425" ,"User Match Not Found"
我学会了如何导入 csv 并使用类似这样的东西创建新列...
Import-Csv $file | Select-Object -Property *, @{Name="UserStatus";Expression={
if ($true) {"fill value in here"}
}} | Export-Csv $newFile -NoType
所以我在想这样的事情。我只是不确定如何通过管道 search/find/pass 多个 CSV 文件值。
注意:其中一些 CSV 文件在我们要搜索的列前后有大约 15 列。此外,一些列值有一个逗号,所以我不能真正依赖 -Delimiter ,
。此外,某些列值没有 "
(如果您以 txt 格式打开 CSV)。
如果值被正确引用(即如果 CSV 有效),包含逗号的列应该不是问题。 Import-Csv
将正确导入记录 42,"a,b",c
作为三个值 42
、a,b
和 c
。如果您的 CSV 格式不正确:请先修复它。
从第一个 CSV 文件中获取登录 ID:
$logins = Import-Csv 'C:\path\to\file1.csv' |
Where-Object { $_.Type -eq 'H' -and $_.ContractorDomain } |
Select-Object -Expand LoginNumber
您可以将 ContractorDomain
属性 检查简化为 $_.ContractorDomain
,因为 PowerShell 在该上下文中解释空字符串和 $null
as a boolean value $false
。其他零值或空值(0、0.0、空数组等)也会发生同样的情况,但这在您的场景中应该不是问题。
接下来创建一个 hashtable 将帐户名称映射到它们各自的状态。通过您之前创建的 ID 列表过滤导入的第二个 CSV,因此哈希表仅包含相关映射。
$accountStatus = @{}
Import-Csv 'C:\path\to\file2.csv' | Where-Object {
$logins -contains $_.UserIDNumber
} | ForEach-Object {
$accountStatus[$_.SamAccountName] = $_.AccountStatus
}
使用该哈希表,您现在可以将 UserStatus
列添加到您的第三个 CSV 文件中:
(Import-Csv 'C:\path\to\file3.csv') |
Select-Object -Property *, @{n='UserStatus';e={
if ($accountStatus.ContainsKey($_.SameAccountName)) {
$accountStatus[$_.SameAccountName]
} else {
'User Match Not Found'
}
}} | Export-Csv 'C:\path\to\file3.csv' -NoType
Import-Csv
语句两边的括号确保文件在 Export-Csv
开始写入之前被完全读取并关闭。仅当您将修改后的数据写回同一个文件时才需要它们,否则可以省略。星号选择所有导入的列,附加的 calculated property 添加您要包含的新列。