2010-05-18 3 views
1

많은 Excel 스프레드 시트의 이름과 스프레드 시트에서 링크 된 파일의 이름을 나열하는 텍스트 파일이 있습니다. 간략한 형태PowerShell에서 정규 표현식을 사용하여 반복 하위 시리즈 일치

그것은 다음과 같다 :이 예에서

"Parent 
File1.xls" 

    Link: ChildFileA.xls 
    Link: ChildFileB.xls 
"ParentFile2.xls" 
"ParentFile3.xls" 
    Blah 
    Link: ChildFileC.xls 
    Link: ChildFileD.xls 
    More Junk 
    Link: ChildFileE.xls 
"Parent 
File4.xls" 
    Link: ChildFileF.xls 

, ParentFile1.xls ParentFile2.xls가 더 삽입 된 링크를 가지고 있지 ChildFileA.xls ChildFileB.xls 및 링크를 포함하고있다 ParentFile3.xls 3 개의 임베디드 링크가 있습니다.

나는 다음과 같은 형식의 텍스트 파일 생성 출력을 구문 분석 PowerShell의 정규 표현식을 쓰기 위해 노력하고 있어요 :

ParentFile1.xls:ChildFileA.xls,ChildFileB.xls 
ParentFile3.xls:ChildFileC.xls,ChildFileD.xls,ChildFileE.xls 
etc 

작업은 텍스트 파일이 쓰레기를 많이 포함되어 있다는 사실에 의해 복잡 각 줄 사이에는 부모가 항상 자식을 가질 수는 없습니다. 또한 단일 파일 이름이 여러 줄을 넘길 수 있습니다. 그러나 부모와 자식 파일 이름이 항상 명확하게 구분되어 있기 때문에 소리가 나쁘지는 않습니다 (따옴표가있는 부모와 접두사가있는 자식 :).

$content = [string]::Join([environment]::NewLine, (Get-Content C:\Temp\text.txt)) 
$regex = [regex]'(?im)\s*\"(.*)\r?\n?\s*(.*)\"[\s\S]*?Link: (.*)\r?\n?' 
$regex.Matches($content) | %{$_.Groups[1].Value + $_.Groups[2].Value + ":" + $_.Groups[3].Value} 

위의 예제를 사용하여 그것을 출력 :

ParentFile1.xls:ChildFileA.xls 
ParentFile2.xls""ParentFile3.xls:ChildFileC.xls 
ParentFile4.xls:ChildFileF.xls 

이 두 가지 문제가 있습니다 다음과 같이 내가 사용하고

파워 쉘 코드입니다. 첫째, 자식이없는 부모가 처리 될 때마다 개행 문자 대신에 ""를 포함합니다. 그리고 가장 중요한 두 번째 문제는 각 부모에 대해 단 한 명의 자녀 만 표시된다는 것입니다. 나는 어떻게 든 재귀 적으로 각 부모에 대해 존재하는 여러 자식 링크를 캡처하고 표시해야한다고 생각하지만 정규 표현식으로이 작업을 수행하는 방법에 관해 완전히 이해하기 어렵습니다.

에이미 (Amy) 도움을 주시면 대단히 감사하겠습니다. 이 파일에는 수천 줄의 수천이 포함되어 있으며 수동 처리는 옵션이 아닙니다.

+0

Eww, 어떤 형식입니까? 실제로 얼마나 엄격합니까? 현재 정규 표현식은 하나, 세 개 이상이 아닌 두 줄로 분리 된 상위 파일 이름 만 처리합니다. 그게 문제 야? 또한 정크가 따옴표를 포함 할 수 있습니까 (예 : 단일 부모의 파싱을 언제 종료 할 수 있는지). 나는 그것이 정규식으로 할 수 있을지도 모르지만, 더 쉽게 할 수 있다고 생각한다. 정규 표현식 부분이 요구 사항인지 구현 아이디어인가? –

+0

필자가 지금까지 취한 데이터 샘플에서는 상위 파일 이름이 두 줄로 만 나뉘어 지지만 이론적으로는 3으로 확장 될 가능성이 있음을 알 수 있습니다. 정크에는 따옴표가 포함되지 않습니다. 정규식은 요구 사항이 아니라 구현 아이디어입니다. – Hinch

답변

1

개인적으로는 정규식을 사용하여 개인적으로 그 부분 만 해결할 것입니다.

$text = (Get-Content C:\Temp\text.txt) -join "`r`n" 
$text = [regex]::replace($text, '(?im)"Parent[^"]+"', { [regex]::replace($args, '(?m)\s*', '') }) 

을 그리고 수동 처리를 계속 :

우선이 같은 부모의 파일 이름을 결합 할 것입니다.

$res = @() 
$parent = $null 
switch -regex ($text -split "`n") { 
    '^"Parent' { if ($parent) { $res += $parent } 
       $parent = new-object PsObject -prop @{Name = $_.Trim('"'); [email protected]()} 
    } 
    '^\s*Link:' { $parent.Links += $_ -replace '^\s*Link:\s*', '' } 
} 
if ($parent) { $res += $parent } 

$res | % { 
$n = $_.Name 
$links = $_.Links -join ',' 
write-host "$n`:$links" 
} 
+0

좋은 직장. 그건 속임수 야. 비록 $ text2는 실제로 $ text 여야한다고 생각합니다. – Hinch

+0

예, 이전 변수 이름;) – stej

관련 문제