在Powershell中过滤其他字符串数组的字符串数组

时间:2014-05-15 20:32:37

标签: arrays string powershell filter compare

我需要帮助过滤一个大的.CSV文件,某个行必须只包含另一个Powershell函数返回的数组中保存的一组预定字符串中的字符串。

例如,假设我有以下内容进行过滤:

datastore3
datastore1 vl_datastore2 datastore3
datastore1 vl_datastore2 datastore3
datastore1 datastore3

使用以下字符串数组,我必须丢弃任何坏行:

datastore1 datastore3(索引0中的datastore1,索引1中的datastore3)

换句话说,我的函数应该自动删除其中包含“vl_datastore2”子字符串的任何行,因此只保留第一行和最后一行。

我该如何解决这个问题?现在我能够分割行以过滤成一个字符串数组(“datastore1 vl_datastore2 datastore3”因此将是一个包含3个字符串的数组),但我找不到使用任何Powershell运算符的正确方法正确过滤我的清单。

提前致谢!

2 个答案:

答案 0 :(得分:0)

不知道这是否有帮助,但是:

$TestArray = @(
'datastore3'
'datastore1 vl_datastore2 datastore3',
'datastore1 vl_datastore2 datastore3',
'datastore1 datastore3'
)

$Filters = @(
'datastore1',
'datastore3'
)

[regex]$regex = ‘(?i)(‘ + (($Filters |foreach {[regex]::escape($_)}) –join “|”) + ‘)’

$TestArray | Where {-not ($_.split() -notmatch $regex)}

datastore3
datastore1 datastore3

从$ Filter数组中的字符串构建交替正则表达式,这样您就可以在一次操作中将多行匹配到多个字符串。

这里解释构建正则表达式的位: http://blogs.technet.com/b/heyscriptingguy/archive/2011/02/18/speed-up-array-comparisons-in-powershell-with-a-runtime-regex.aspx

答案 1 :(得分:0)

我想我会去另一条路线并使用一个标志变量和-notcontains。运行数组逐行测试,拆分每一行,检查拆分的每一部分,看它是否包含在批准的条款列表中,如果没有设置一个标志,那么该行不会传递下去管道。

$TestArray = @("datastore3",
"datastore1 vl_datastore2 datastore3",
"datastore1 vl_datastore2 datastore3",
"datastore1 datastore3")

$Filter = @("datastore1","datastore3")

$TestArray|%{
    $SetValid = $True
    $_ -split " "|?{$Filter -notcontains $_}|%{$SetValid=$false}
    if($SetValid){$_}
}

运行时导致:

datastore3
datastore1 datastore3