使用powershell比较两个csv,并返回匹配值和非匹配值

使用powershell比较两个csv,并返回匹配值和非匹配值,powershell,csv,Powershell,Csv,我有两个csv文件,我想检查username.csv中的用户与userdata.csv copy的匹配情况 到output.csv。如果不匹配,则在output.csv中单独返回名称 例如:用户数据包含3列 UserName,column1,column2 Hari,abc,123 Raj,bca,789 Max,ghi,123 Arul,987,thr Prasad,bxa,324 username.csv包含用户名 Hari Rajesh Output.csv应包含 Hari,abc,1

我有两个csv文件,我想检查username.csv中的用户与userdata.csv copy的匹配情况
到output.csv。如果不匹配,则在output.csv中单独返回名称

例如:用户数据包含3列

UserName,column1,column2
Hari,abc,123
Raj,bca,789
Max,ghi,123
Arul,987,thr
Prasad,bxa,324
username.csv包含用户名

Hari
Rajesh
Output.csv应包含

Hari,abc,123
Rajesh,NA,NA
如何做到这一点。谢谢

对不起

$Path = "C:\PowerShell"
$UserList = Import-Csv -Path "$($path)\UserName.csv"
$UserData = Import-Csv -Path "$($path)\UserData.csv"

foreach ($User in $UserList)
{
    ForEach ($Data in $UserData)
    {
        If($User.Username -eq $Data.UserName)
        {
            # Process the data

            $Data
        }
    }
}
这只返回匹配的值。我还需要在输出中添加不匹配的值
文件谢谢。

像这样的东西会有用的:

$Path = "C:\PowerShell"
$UserList = Import-Csv -Path "$($path)\UserName.csv"
$UserData = Import-Csv -Path "$($path)\UserData.csv"
$UserOutput = @()

    ForEach ($name in $UserList)
    {

        $userMatch = $UserData | where {$_.UserName -eq $name.usernames}
        If($userMatch)
        {
            # Process the data

            $UserOutput += New-Object PsObject -Property @{UserName =$name.usernames;column1 =$userMatch.column1;column2 =$userMatch.column2}
        }
        else
        {
        $UserOutput += New-Object PsObject -Property @{UserName =$name.usernames;column1 ="NA";column2 ="NA"}
        }
    }
$UserOutput | ft
它循环遍历用户列表中的每个名称。第9行在userdata CSV中搜索匹配的用户名。如果找到匹配的用户名,则将该用户的用户数据添加到输出中。如果未找到匹配的用户名,则将用户名添加到输出中,并在两列中使用NA

必须更改您的用户列表csv:

usernames
Hari
Rajesh
预期产出:

UserName                          column1                           column2                         
--------                          -------                           -------                         
Hari                              abc                               123                             
Rajesh                            NA                                NA 

类似这样的方法会奏效:

$Path = "C:\PowerShell"
$UserList = Import-Csv -Path "$($path)\UserName.csv"
$UserData = Import-Csv -Path "$($path)\UserData.csv"
$UserOutput = @()

    ForEach ($name in $UserList)
    {

        $userMatch = $UserData | where {$_.UserName -eq $name.usernames}
        If($userMatch)
        {
            # Process the data

            $UserOutput += New-Object PsObject -Property @{UserName =$name.usernames;column1 =$userMatch.column1;column2 =$userMatch.column2}
        }
        else
        {
        $UserOutput += New-Object PsObject -Property @{UserName =$name.usernames;column1 ="NA";column2 ="NA"}
        }
    }
$UserOutput | ft
它循环遍历用户列表中的每个名称。第9行在userdata CSV中搜索匹配的用户名。如果找到匹配的用户名,则将该用户的用户数据添加到输出中。如果未找到匹配的用户名,则将用户名添加到输出中,并在两列中使用NA

必须更改您的用户列表csv:

usernames
Hari
Rajesh
预期产出:

UserName                          column1                           column2                         
--------                          -------                           -------                         
Hari                              abc                               123                             
Rajesh                            NA                                NA 

阅读关于的帮助。阅读关于的帮助。嗨,Dane,谢谢你的脚本,它工作得很好。但是为什么if和elseif在我发布的脚本中不起作用呢?它要么返回多次名称,要么返回长度。再次感谢您的时间。您的方法要求您检查每个用户名,并在每次检查是否存在匹配项时执行某些操作。我为列表中的每个用户发布的一个,它通过数据csv执行一个完整的循环。然后只进行一次检查,检查是否在循环中找到了用户,并进行相应的处理。它只是更有效,丹麦,谢谢你的脚本,它工作得很完美。但是为什么if和elseif在我发布的脚本中不起作用呢?它要么返回多次名称,要么返回长度。再次感谢您的时间。您的方法要求您检查每个用户名,并在每次检查是否存在匹配项时执行某些操作。我为列表中的每个用户发布的一个,它通过数据csv执行一个完整的循环。然后只进行一次检查,检查是否在循环中找到了用户,并进行相应的处理。只是效率更高