繁体   English   中英

使用where-object数组来过滤csv中的多个字符串

[英]Using arrays with where-object to filter multiple strings out of a csv

我试图过滤掉包含数组中任何值的csv中的行。

使用这篇文章作为参考: 使用-notlike在PowerShell中过滤掉多个字符串

我设法让它使用这种格式:

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
    where {$_."SubmitterName" -notlike "*${Report2a}*" 
      -and $_."SubmitterName" -notlike "*${Report2b}*" 
      -and $_."SubmitterName" -notlike "*${Report2c}*"} |
    Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation

最终我计划重写脚本,以便从最终用户生成的文本文件中提取排除列表。 为了做到这一点,我必须让它访问数组中的值。 我尝试使用以下语法执行此操作,但它没有按预期工作:

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
    where {$_."SubmitterName" -notlike "*${Report2[0]}*" 
      -and $_."SubmitterName" -notlike "*${Report2[1]}*" 
      -and $_."SubmitterName" -notlike "*${Report2[2]}*"} |
    Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation

我觉得这只是一个语法问题,但是在玩了很长时间之后,我已经没有想法了。 我觉得这是一个语法问题

这是一个语法问题。 ${Name}语法主要用于包含奇数字符的名称,例如${A ~*Strange*~ Variable Name} 它不是表达式,所以你不能用大括号内的[0]索引它; 这将被视为变量名称的文字部分。

相反,您可以使用子表达式$(...)来执行此操作:

"*$($Report2[0])*"

作为替代方法,我可能会将整个数组转换为单个正则表达式,然后使用-match (或-notmatch )运算符:

$regex = $Report2.ForEach({ [RegEx]::Escape($_) }) -join '|'

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
    where {$_."SubmitterName" -notmatch $regex} |
    Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation

这将获取$Report2数组,然后构建一个具有相同值的数组,但是为正则表达式转义(以便任何特殊字符按字面匹配),然后构建一个如下所示的正则表达式:

Item1|Item2|Item3

在正则表达式,管道是交替,所以寻找一个匹配的Item1 Item2等正则表达式查找任何地方在字符串中,因此并不需要一个通配符的方式-like呢。

因此,如果构建为预先包含数组中的所有项目,那么您可以使用-notmatch来实现相同的功能,并且您不必对一堆索引进行硬编码。

你可以像这样使用包含

简洁版本

[string[]]$listexludevalue=Get-Content "C:\temp\exludevalue.txt"
Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | %{$valcontain=$true; $col=$_.Owner; $listexludevalue.ForEach({$valcontain=$valcontain -and !$col.Contains($valuetotest)}); if ($valcontain) {$_} } | Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation

详细版本:

$listexludevalue=Get-Content "C:\temp\exludevalue.txt"

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
% {

    $valcontain=$true

    foreach ($valuetotest in $listexludevalue) {$valcontain=$valcontain -and !$_.SubmitterName.Contains($valuetotest)}

    if ($valcontain) {$_}

   } | Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM