检查数组/数据 Table 中的两个值是否匹配

Check if Two Values in Array / Data Table match

我之前在这里提出过这个问题,但是我漏掉了一个导致大问题的重要细节。会有重复的帐号。所以我现在按 current_read_date 来做,以避免帐号重复。确保添加到 $accounts 的值是来自 CSV 的新值。

我正在尝试将 $f 中与 $table4 中的帐户不匹配的所有帐户获取到 $accounts 中。但我还需要检查 current_read_date 是否匹配。

CSV 到数组 $f:

Account_no |occupant_code|current_read_date
-----------|-------------|-----------------
12345      |    1        |  7/17/2017 15:32:00 AM
67890      |    2        |  7/17/2017 12:00:00 AM
45678      |    3        |  7/17/2017 12:00:00 AM

数据表$table4

Account_no |occupant_code|current_read_date
-----------|-------------|-----------------
12345      |   1         | 7/17/2017 12:00:00 AM
12345      |   1         | 7/17/2017 15:32:00 AM
67890      |   1         | 7/17/2017 13:00:00 AM
67890      |   1         | 7/17/2017 22:00:00 AM
45678      |   3         | 7/17/2017 12:00:00 AM

想要的结果:

$accounts = 
    67890      |    2        |  7/17/2017 12:00:00 AM

当前代码:

$accounts = Import-Csv $f |
            select account_no, current_read_date |
            where { $table4.account_no -notcontains $_.account_no }

这需要做的是检查current_read_date是否匹配,即:

我想我需要使用 Group-Object,但我不知道如何正确使用它。

我试过了:

Import-Csv $f |
    select account_no, occupant_code |
    Group-Object account_no |
    Where-Object { $_.Group.current_read_date -notcontains $table4.current_read_date }

这是上一题:
How to use Group-Object on this?

这里的所有答案都失败了,因为我忘记提供 account_no 不是唯一的信息;会有频繁的重复。

非常感谢所有帮助,我已经坚持了一段时间。

我也试过这个

$testList = @()
$testList = Import-Csv $f | select account_no, occupant_code, current_read_date, current_reading
$accounts = new-object System.Collections.ArrayList

$testSet = $table4
foreach($myThing in $testList)
{
    if($myThing.account_no -in $testSet.account_no )
    {
    foreach($ts in $testSet)
     { 
     if ($myThing.account_no -match $ts.account_no -and $myThing.occupant_code -match $ts.occupant_code)
        {
     $ts.account_no 
     $ts.occupant_code

     }

     else {
    $accounts.add($myThing) | out-null
    write-host $mything
        }
    }
}

这失败了,因为它遍历了每个数字,因此,12345 将与 67890 进行检查,并将 12345 添加到 $accounts 列表中,即使它已经存在,因为我无法一次将每个单独与 table4 进行比较.

谢谢

$accounts = $f | Where {
    $Record = $_
    $AccNo = $table4 | Where {$_.Account_no -eq $Record.Account_no}
    !($AccNo | Where {$_.current_read_date -eq $Record.current_read_date})
}
$accounts | Format-Table

结果:

Account_no occupant_code current_read_date
---------- ------------- -----------------
67890      2             7/17/2017 12:00:00 AM

根据 $table4

中的记录构建参考列表
$ref = $table4 | ForEach-Object {
    $_.Account_no, $_.occupant_code, $_.current_read_date -join ','
}

然后按该参考列表过滤来自 $f 的记录:

$accounts = Import-Csv $f | Where-Object {
    $ref -notcontains ($_.Account_no, $_.occupant_code, $_.current_read_date -join ',')
} | Select-Object -Expand Account_no -Unique