我需要帮助过滤一个大的.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运算符的正确方法正确过滤我的清单。
提前致谢!
答案 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