Powershell:比较2个CSV文件的等式,然后输出等式和另一行

2eafrhcq  于 2022-12-15  发布在  Shell
关注(0)|答案(3)|浏览(112)

我正试图整理最近一份关于PC用户似乎没有使用的报告,为此我得到了一个名为“报告”的CSV文件和一个名为“数据”的CVS文件。
报告和数据仅共享1列,即用户全名,如何获得既提供用户全名又提供仅来自报告的PC的结果?
到目前为止,我有下面的代码获得用户的全名,但我不知道如何获得设备

$report = Import-Csv "C:\Temp\\report.CSV" -Delimiter ";"
$data = Import-Csv  "C:\Temp\\data.CSV" -Delimiter ";"
$UserOutput = @()

    ForEach ($name in $report)
    {
        $userMatch = $data | where {$_.FullName -like $name.FullName}
        If($userMatch)
        {
        $UserOutput += New-Object PsObject -Property @{UserName =$name.FullName;Device=$userMatch.Device}
        }
        else
        {
        $UserOutput += New-Object PsObject -Property @{UserName =$name.FullName;Device ="NA"}
        }
    }
$UserOutput | ft

这给出了一个很好的列表,但我找不到设备,所以它最终看起来像这样
设备用户名


安德斯·阿达尔· Json
安德烈·科瓦奇
安娜·丹克

wz3gfoph

wz3gfoph1#

可以使用Group-Object -AsHashtable关联两个对象数组上的FullName属性。这假定关联时属性值完全匹配。

$data = Import-Csv  "C:\Temp\\data.CSV" -Delimiter ";" |
            Group-Object Device -AsHashTable -AsString

Import-Csv "C:\Temp\\report.CSV" -Delimiter ";" | ForEach-Object {
    $object = [pscustomobject]@{
        UserName = $_.FullName
        Device   = 'NA'
    }
    if($data.ContainsKey($_.FullName)) {
        $object.Device = $data[$_.FullName]
    }
    $object
} | Format-Table
tez616oj

tez616oj2#

假设您提供的详细信息在两个csv文件中都可用,这里是一个示例。

$CSV1 = Import-Csv "C:\Temp\\report.CSV" -Delimiter ";"
$CSV2 = Import-Csv  "C:\Temp\\data.CSV" -Delimiter ";"

$Count = $CSV2.Count
$Results = For ($i = 0; $i -lt $Count; $i++) {
    If ($CSV2[$i].FullName -eq $CSV1[$i].FullName) {
        $Match = "Match"
    } 
    Else {
        $Match = "No Match found"
    }
    [PSCustomObject]@{
        UserName = $CSV2[$i].FullName
        Device = $CSV2[$i].Device
        Results = $Match
    }
}
$Results | Export-Csv -Path "C:\Temp\results.csv" -NoTypeInformation
ep6jt1vc

ep6jt1vc3#

可接受的答案看起来假设CSV上的条目计数是一对一的匹配,因为它有一个比较相同CSV数组元素编号的循环。
在您的描述中,您提到Report.csv是不常用PC的列表,Data.csv是“All PC”列表。如果您的条目计数不是一对一,可能需要两个循环,如下所示。

$Results = 0..$($REPORT.Count - 1) | ForEach-Object { 
    $i = $_ 
    $($DATA | ForEach-Object { if($_.Fullname -eq $REPORT[$i].Fullname) { <# DATA PSCUSOMOBJECT#> }})
}

相关问题