获取基于另一个数组的数组

时间:2014-03-18 15:46:31

标签: powershell csv

我需要获取一个CSV文件,然后根据帐号创建不同格式的文件。我需要的帐号是在没有其他字段的其他文件中(我需要填写它们以匹配)。这只是下面的一个。

我知道我可以循环使用foreach,但试图避免这种情况。这没有错误,但即使我知道有匹配也不起作用。

$sms_accts = import-csv -path "H:\scrap\Positive Pay Feeds\sms_accounts.txt"
$input_file = import-csv -path "H:\scrap\Positive Pay Feeds\CNVDC939.POSITIVE PAY ISSUES.txt"

$sms_accts = $sms_accts  | Select-Object @{Name="Acct";Expression={$_.Acct.PadLeft(11,"0")}}

$to_sms_file = $input_file  | where-object { $sms_accts -contains ($_.ACCOUNT_NUMBER.PadLeft(11,"0"))  }

$to_sms_file

它什么都不返回。

以下示例文件。

sms_accounts.txt:

Acct
12345678
23456789


Positive Pay:
    "SPONSOR_BANK_ID","BE_CLIENT_ID","COMPANY_NAME","ACCOUNT_NUMBER","SERIAL","AMOUNT","PAYEE","ISSUE_TYPE","STATUS","ENTRY_DATE","ISSUE_DATE"
    "100741","1004928","Acme","0012345678","11111","2468","","0","1","2/11/2014 5:50:34 PM","2/10/2014"
    "100741","1004928","ABC","009999999","22222","180.34","","0","1","2/20/2014 9:01:38 PM","2/20/2014"

2 个答案:

答案 0 :(得分:1)

您可以使用Acct属性过滤$sms_accts

... | where-object { $sms_accts.Acct -contains ($_.ACCOUNT_NUMBER.PadLeft(11,"0"))}

通过这种方式,您无需在代码中使用foreach

答案 1 :(得分:0)

您使用单个属性$sms_acctsAcct处理为自定义对象数组:

$sms_accts = $sms_accts  | Select-Object @{Name="Acct";Expression={$_.Acct.PadLeft(11,"0")}}

然后检查数组中是否有特定的字符串

... | where-object { $sms_accts -contains ($_.ACCOUNT_NUMBER.PadLeft(11,"0")) }

由于您的自定义对象都不是字符串(即使每个字符串都有字符串属性),因此您无法获得匹配项。改变两行

$sms_accts = import-csv -path "H:\scrap\Positive Pay Feeds\sms_accounts.txt"

$sms_accts = $sms_accts  | Select-Object @{Name="Acct";Expression={$_.Acct.PadLeft(11,"0")}}

进入这个:

$sms_accts = Import-Csv "H:\scrap\Positive Pay Feeds\sms_accounts.txt" | % {
               $_.Acct.PadLeft(11,"0")
             }

您的支票将按预期运作。