检查数组/数据 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
是否匹配,即:
- 12345:来自
$f
和 $table4
的帐户和日期匹配;所以它被忽略了
- 67890:账户匹配
$table4
,但是current_read_date不匹配,所以是一个新值,所以添加到$accounts
.
我想我需要使用 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
我之前在这里提出过这个问题,但是我漏掉了一个导致大问题的重要细节。会有重复的帐号。所以我现在按 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
是否匹配,即:
- 12345:来自
$f
和$table4
的帐户和日期匹配;所以它被忽略了 - 67890:账户匹配
$table4
,但是current_read_date不匹配,所以是一个新值,所以添加到$accounts
.
我想我需要使用 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