![](/img/trans.png)
[英]PowerShell - Filter filenames using pipeline where-object with array of strings
[英]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.