【问题标题】:Check if a value exists in one csv file and add static text to another csv field with Powershell检查一个值是否存在于一个 csv 文件中,并使用 Powershell 将静态文本添加到另一个 csv 字段
【发布时间】: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 文件如下:

1. allStaff.csv 2.VPN.csv 3.CRX.csv 4.TMS.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


【解决方案1】:

这是完成这项工作的一种方法。 [grin] 它假定您只想找到第一个连接类型。如果你想要所有这些[例如,JBloggs 列出了所有 3 种类型],你需要将它们连接起来。

它的作用......

  • 在 CSV 文件中进行虚假读取
    当准备好使用真实数据时,注释掉或删除整个#region/#endregion部分并使用Get-Content
  • 遍历主集合
  • 使用开关测试每个连接类型列表中的成员资格
    当它找到匹配项时,它会中断开关,因为它假定您只想要第一个匹配项。如果您想要所有这些,那么您将需要累积它们而不是打破开关块。
  • 适当设置$ConnectionType
  • 用所有需要的道具构建一个 PSCO
    这可能可以通过使用Select-Object、通配符属性选择器和计算属性来缩短。
  • 将其发送到$Results 集合
  • 在屏幕上显示
  • 将其保存为 CSV 文件

代码...

#region >>> fake reading in CSV files
#    in real life, use Import-CSV
$AllUsers = @'
FirstName, LastName, UserName, Position, Area
Joe, Bloggs, jbloggs, Gardener, Maintenance
Jim, Smith, jsmith, Accountant, Finance
Bob, Seger, bseger, HR Advisor, Human Resources
Adam, Boson, aboson, Customer Support, IT
Adele, bree, abree, Payroll, Finance
'@ | ConvertFrom-Csv

$Vpn = @'
UserName
jbloggs
jsmith
'@ | ConvertFrom-Csv

$Crx = @'
UserName
jbloggs
jsmith
bseger
'@ | ConvertFrom-Csv

$Tms = @'
UserName
jbloggs
jsmith
bseger
aboson
'@ | ConvertFrom-Csv
#endregion >>> fake reading in CSV files

$Results = foreach ($AU_Item in $AllUsers)
    {
    # this presumes you want only the 1st connection type found
    #     if you want all of them, then you will need to concatenate them
    switch ($AU_Item.UserName)
        {
        {$_ -in $Vpn.UserName}
            {
            $ConnectionType = 'VPN'
            break
            }
        {$_ -in $Crx.UserName}
            {
            $ConnectionType = 'CRX'
            break
            }
        {$_ -in $Tms.UserName}
            {
            $ConnectionType = 'TMS'
            break
            }
        default
            {
            $ConnectionType = 'None'
            }
        }

    [PSCustomObject]@{
        FirstName = $AU_Item.FirstName
        LastName = $AU_Item.LastName
        UserName = $AU_Item.UserName
        Position = $AU_Item.Position
        Area = $AU_Item.Area
        ConnectionTYpe = $ConnectionType
        }
    }

# on screen
$Results

# send to CSV
$Results |
    Export-Csv -LiteralPath "$env:TEMP\brokencrow_-_UserConnectionType.csv" -NoTypeInformation

屏幕输出被截断...

FirstName      : Joe
LastName       : Bloggs
UserName       : jbloggs
Position       : Gardener
Area           : Maintenance
ConnectionTYpe : VPN

[*...snip...*] 

FirstName      : Adele
LastName       : bree
UserName       : abree
Position       : Payroll
Area           : Finance
ConnectionTYpe : None

来自brokencrow_-_UserConnectionType.csv的CSV文件内容...

"FirstName","LastName","UserName","Position","Area","ConnectionTYpe"
"Joe","Bloggs","jbloggs","Gardener","Maintenance","VPN"
"Jim","Smith","jsmith","Accountant","Finance","VPN"
"Bob","Seger","bseger","HR Advisor","Human Resources","CRX"
"Adam","Boson","aboson","Customer Support","IT","TMS"
"Adele","bree","abree","Payroll","Finance","None"

【讨论】:

  • 感谢您对此的帮助。我会修改我的编码,让你知道这是怎么回事。 ;-)
  • @brokencrow - 不客气!很高兴能帮上一点忙……[grin]
  • 酷!很高兴知道你让它按需要工作了……[grin]
  • 很确定这不仅仅是“一点”帮助 [咧嘴笑]。非常欣赏。那我怎么给你送“虚拟啤酒”呢?
  • 我们即将因为在评论部分交谈而被唠叨,所以我会简单地 [grin] 接受你的慷慨提议... [grin]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
相关资源
最近更新 更多