2016-10-25 3 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