2014-05-15 2 views
0

특정 행에 다른 Powershell 함수에서 반환 된 배열에있는 문자열 중 미리 정의 된 문자열 만 포함해야하는 큰 .CSV 파일을 필터링하는 데 도움이 필요합니다.Powershell에서 다른 문자열 배열을 사용하여 문자열 배열 필터링

datastore3 
datastore1 vl_datastore2 datastore3 
datastore1 vl_datastore2 datastore3 
datastore1 datastore3 

를 I가 불량 로우 버려야되는 문자열 다음 배열 : 인덱스 0

datastore1의 datastore3 (datastore1을 datastore3

예를 들어, I는 필터링 다음했다고 가정 in index 1)

즉, 내 함수는 "vl_datastore2"하위 문자열이있는 모든 행을 자동으로 제거해야하므로 첫 번째 행과 마지막 행만 남습니다.

어떻게해야합니까? 지금은 문자열을 배열로 필터링하기 위해 행을 분할 할 수 있습니다 ("datastore1 vl_datastore2 datastore3"은 3 개의 문자열을 가진 배열이됩니다). 그러나 Powershell 연산자를 사용하는 올바른 방법을 찾는 데 문제가 있습니다. 내 목록을 올바르게 필터링하십시오.

미리 감사드립니다.

답변

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 

. 정규식을 구축하는 것

비트는 여기에 설명 : http://blogs.technet.com/b/heyscriptingguy/archive/2011/02/18/speed-up-array-comparisons-in-powershell-with-a-runtime-regex.aspx

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 
관련 문제