2016-10-25 35 views
2

我有一個文本文件,它看起來像這樣:濾波部分,包括起點和終點的線 - PowerShell的

Data I'm NOT looking for 
More data that doesn't matter 
Even more data that I don't 

&Start/Finally the data I'm looking for 
&Data/More data that I need 
&Stop/I need this too 

&Start/Second batch of data I need 
&Data/I need this too 
&Stop/Okay now I'm done 
Ending that I don't need 

這裏是輸出需要什麼:

File1.txt

&Start/Finally the data I'm looking for 
&Data/More data that I need 
&Stop/I need this too 

FILE2.TXT

&Start/Second batch of data I need 
&Data/I need this too 
&Stop/Okay now I'm done 

我需要爲文件夾中的所有文件(有時會出現,這將需要過濾多個文件)的文件名可以增加這樣做:恩。 File1.txt,File2.txt,File3.txt。

這是我已經沒有運氣嘗試:

ForEach-Object{ 
$text -join "`n" -split '(?ms)(?=^&START)' -match '^&START' | 
Out-File B:\PowerShell\$filename} 

謝謝!

回答

1

看起來你是非常接近:你的代碼正確提取的感興趣的段落,但非& -starting線內段進行過濾是失蹤,你需要寫款特定輸出文件:

$text -join "`n" -split '(?m)(?=^&Start)' -match '^&Start' | 
    ForEach-Object { $ndx=0 } { $_ -split '\n' -match '^&' | Out-File "File$((++$ndx)).txt" } 

這將創建File1.txt開始感興趣每一個段落順序編號的文件。


要使用固定命名方案File<n>所有輸入文件(並因此累積的編號)的文件夾中的所有文件做到這一點,與輸出文件名:

Get-ChildItem -File . | ForEach-Object -Begin { $ndx=0 } -Process { 
    (Get-Content -Raw $_) -split '(?m)(?=^&Start)' -match '^&Start' | 
    ForEach-Object { $_ -split '\n' -match '^&' | Out-File "File$((++$ndx)).txt" } 
} 

要做到這一點文件夾中的每個文件,輸出文件名基於輸入文件名和每個輸入文件的編號(PSv4 +,由於使用-PipelineVariable):

Get-ChildItem -File . -PipelineVariable File | ForEach-Object { 
(Get-Content -Raw $_) -split '(?m)(?=^&Start)' -match '^&Start' | 
    ForEach-Object {$ndx=0} { $_ -split '\n' -match '^&' | Out-File "$($File.Name)$((++$ndx)).txt" } 
} 
+1

完美地工作。謝謝!!! – red2015

0

像這樣?

$i=0 
gci -path "C:\temp\ExplodeDir" -file | %{ (get-content -path $_.FullName -Raw).Replace("`r`n`r`n", ";").Replace("`r`n", "~").Split(";") | %{if ($_ -like "*Start*") {$i++; ($_ -split "~") | out-file "C:\temp\ResultFile\File$i.txt" }} } 
1

您發佈第二個問題(違反規則),它被刪除,但這是我的快速回答。我希望它能幫助你,讓你更有意識PS的工作原理:

$InputFile = "C:\temp\test\New folder (3)\File1.txt" 

# get file content 
$a=Get-Content $InputFile 

# loop for every line in range 2 to last but one 
for ($i=1; $i -lt ($a.count-1); $i++) 
    { 
    #geting string part between & and/, and construct output file name 
    $OutFile = "$(Split-Path $InputFile)\$(($a[$i] -split '/')[0] -replace '&','').txt" 

    $a[0]| Out-File $OutFile #creating output file and write first line in it 
    $a[$i]| Out-File $OutFile -Append #write info line 
    $a[-1]| Out-File $OutFile -Append #write last line 
    } 
+0

我不知道這是違反規則在這個論壇上發佈多個問題。抱歉。 – red2015

+0

把「我有蘋果​​,想要餡餅」這樣的問題聲音放在規則上是違反規定的。您需要更加詳細,添加您的代碼並提出更具體的問題,而不是一般問題。 – autosvet

+0

好吧,很酷。感謝回覆。 – red2015

相關問題