【发布时间】:2020-04-19 05:12:36
【问题描述】:
我需要检查第一个 csv 文件中的列值是否存在于其他三个 csv 文件中的任何一个中,并按优先顺序将值返回到新的 csv 文件中。
因此,如果用户名字段来自allStaff.csv 存在于 sessionVPNct.csv 文件的用户名列表中,将静态文本作为“VPN”放入最终的 csv 文件中。如果不存在,请检查下一个 csv 文件:sessionCRXct.csv 然后放入静态文本'CRX',如果不检查最后一个 csv 文件:sessionTMSct.csv 然后放入静态文本:TM 如果不存在则放入静态文本' none' 到最终的 csv 文件中。
我有四个 csv 文件如下:
我已将 csv 文件导入如下变量:
$allUsers = Import-Csv -Path "C:\allStaff.csv"
$vpn = Import-Csv -Path "C:\VPN.csv" | Select-Object -ExpandProperty UserName
$crx = Import-Csv -Path "C:\CRX.csv" | Select-Object -ExpandProperty UserName
$tms = Import-Csv -Path "C:\TMS.csv" | Select-Object -ExpandProperty UserName
$allUsers 变量显示以下内容:
名字姓氏用户名位置区域 --------- -------- -------- -------- ---- 乔博客 jbloggs 园丁维护 吉姆·史密斯 jsmith 会计 财务 Bob Seger bseger 人力资源顾问 人力资源 Adam Boson aboson 客户支持 IT 阿黛尔·布雷·阿布雷工资财务$vpn 变量显示以下内容:
用户名 -------- 博客 史密斯$crx 变量显示以下内容:
用户名 -------- 博客 史密斯 赛格$tms 变量显示以下内容:
用户名 -------- 博客 史密斯 赛格 玻色子然后我有以下行来启动结果 csv 文件
$result = $allUsers | Select-Object *,ConnectionMethod
不太确定如何进行最终查询,我认为这应该是一个 if else 循环来遍历 $result 变量中的所有行,并检查其他 csv 是否存在用户名字段,然后返回静态文本。
$result | Export-Csv -Path "C:\allStaffConnections.csv"
这就是我需要显示最终 allStaffConnections.csv 文件的方式。
名字 姓氏 用户名 位置 区域 连接方法 --------- -------- -------- -------- ---- ------------- - 乔博客 jbloggs 园丁维护 VPN 吉姆·史密斯 jsmith 会计财务 VPN Bob Seger bseger 人力资源顾问 人力资源 CRX Adam Boson aboson 客户支持 IT TMS Adele bree abree 工资财务 无下面的代码我在正确的轨道上吗?
$allUsers = Import-Csv -Path "C:\allStaff.csv"
$vpn = Import-Csv -Path "C:\VPN.csv" | Select-Object -ExpandProperty UserName
$crx = Import-Csv -Path "C:\CRX.csv" | Select-Object -ExpandProperty UserName
$tms = Import-Csv -Path "C:\TMS.csv" | Select-Object -ExpandProperty UserName
$vpnText = 'VPN'
$crxText = 'CRX'
$txsText = 'TMS'
$noneText = 'none'
$allUsersExtended = $allUsers | Select-Object *,ConnectionMethod
$results = $allUsersExtended.ForEach(
{
if($vpn -Contains $PSItem.UserName) {
# add $vpnText to ConnectionMethod column for that row in the $result
$PSItem.ConnectionMethod = $vpnText
}elseif($crx -Contains $PSItem.UserName) {
# add $crxText to ConnectionMethod column for that row in the $result
$PSItem.ConnectionMethod = $crxText
}elseif($tms -Contains $PSItem.UserName) {
# add $txsText to ConnectionMethod column for that row in the $result
$PSItem.ConnectionMethod = $tmsText
}else {
# add $noneText to ConnectionMethod column for that row in the $result
$PSItem.ConnectionMethod = $noteText
}
})
$results | Export-Csv -Path "C:\allStaffConnections.csv" -NoTypeInformation
这给了我一个空的 allStaffConnections.csv 文件。
我已经逐行运行了代码,并且可以达到:
$allUsersExtended = $allUsers | Select-Object *,ConnectionMethod
这给了我额外的列“ConnectionMethod”,但在运行循环之后,它给了我一个空的 allStaffConnections.csv 文件。
【问题讨论】:
-
遍历
$AllUsers列表,根据共享值在其他列表中查找任何匹配项,使用组合结果构建新的[PSCusomtObject],最后将其写入新的 CSV 文件。 -
@Lee_Dailey - 所以我会在每个其他 csv 文件上使用 MATCH,例如 VPN、CRX、TM 还是没有?你有一些示例代码吗?我已经为此苦苦挣扎了好几个小时。我发布了我开始使用的代码,有点不确定我是否在正确的轨道上。假设我需要在我已经开始的内容中使用嵌套循环
-
不要在上面使用
Select-Object,因为您定义选择的方式会抛出其他属性。保留它们。然后,在循环中,使用$Vpn.Where({$_.UserName -eq $CurrentUserName})或$Vpn - $CurrentUserName。我认为第二个会起作用,但我非常有信心第一个会起作用。 [咧嘴] -
@Lee_Dailey - 您如何将 $CurrentUserName 变量引用到 allStaff.csv 文件?
-
如果您将
-Contain更改为-Contains,您的新代码就可以使用。但是,您在 3 个不同的连接类型列表中有JBloggs......但是您的最终报告显示每个帐户只有一种连接类型。你如何处理多个匹配项?
标签: powershell csv