2016-08-02 10 views
1

Ich bin ein Problem, durch alle Dateien im Verzeichnis und Spalten Looping es auf das Feld nach „[IMPORT]“Powershell-Schleife für das Aufspalten mutiple txt-Dateien in einzelne Dateien

Verzeichnis: \ C \ users $ \ Pepe \ Desktop \ TestInfoFolder

ich habe die folgenden zwei Dateien im Verzeichnis: TestingInfo1.txt TestingInfo2.txt

Sie sehen wie folgt aus:
TestingInfo1.txt

[IMPORT] 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
[IMPORT] 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

TestingInfo2.txt

[IMPORT] 
21 
22 
23 
24 
25 

gewünschten Ergebnisse 3 separate Dateien würde die Zeichenfolge aufgeteilt "[IMPORT]" Das ist in den Dateien enthalten.

Ergebnisse 1:

[IMPORT] 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

2:

[IMPORT] 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

Ergebnisse 3:

[IMPORT] 
21 
22 
23 
24 
25 

Aktuelle Code:

$Path = "\\C\users$\Pepe\Desktop\TestInfoFolder" 
Get-ChildItem $Path | foreach-object { 
    $InputFile = $_.FullName 
    $Reader = New-Object System.IO.StreamReader($InputFile) 
    $N = 1 

While (($Line = $Reader.ReadLine()) -ne $null) { 
    if ($Line -match "[IMPORT]") { 
     $OutputFile = $matches[0] + $N + ".txt" 
     $N++ 
    } 

    Add-Content (Join-Path $Path $OutputFile) $Line 
    } 
} 

Das Problem mit der aktuellen Abfrage ist, dass es die Ergebnisse von TestingInfo2.txt in den Ergebnissen der Ergebnisse 1 anfügt. Bitte lassen Sie mich wissen, wenn Sie weitere Erläuterungen benötigen.

+0

Da alle Ihre Importe das gleiche Wort sind, wird am Anfang jeder Datei '$ N = 1' gestartet. Setzen Sie '$ N = 1' vor die 'Get-ChildItem'-Zeile und es wird nur für immer gezählt. – TessellatingHeckler

Antwort

1

Reguläre Ausdrücke sind dein Freund hier. Dies sollte Ihnen alle Instanzen Ihrer IMPORT Sequenz von allen Dateien in $ Pfad:

ls $Path | cat | select-string -AllMatches "(\[IMPORT\][\s*\d+]+)" | % {$_.Matches.Value} 
+0

Ah, du hast die Frage bearbeitet; Diese Lösung wird jetzt nicht funktionieren, wenn ich sehe, dass die Ziffern in getrennten Zeilen sind. – jbsmith

0

ich es so tun würde:

$SourcePath = "C:\Users\jon_dechiro\Desktop\Test" 
$OutputPath = "C:\Temp" 
$Count = 1 
foreach ($File in (Get-ChildItem -Path $SourcePath -File)) 
{ 
    $FileRawContents = Get-Content $File.FullName -Raw 
    foreach ($Import in ($FileRawContents -split '\[IMPORT\]')) 
    { 
     if ($Import -match '\d') 
     { 
      $ImportEdited = $Import -replace '\n', "`r`n" 
      "[IMPORT]$ImportEdited" | Out-File "$OutputPath\Results$Count.txt" 
      $Count++ 
     } 
    } 
} 

, dass jede Datei und teilt sich durch [IMPORT] öffnet und dann sendet jedes Ergebnis wie angegeben an die Ausgabedateien. Natürlich ändern Sie die Variablen $ SourcePath und $ OutputPath so, wie Sie es brauchen.

+0

das funktioniert gut, aber die resultierende Datei fügt einen Zeilenumbruch nach jeder Zeile, die es liest, nicht ein. Wie würde ich gehen über einen Wagenrücklauf nach Zeile hinzufügen es einliest?Zum Beispiel wenn [IMPORT] CR LF gelesen würde –

+0

Das Prüfen mit Notepad ++ auf meinem System zeigt, dass es nach jeder Zeile in der Ausgabe, die durch den von mir geposteten Code erstellt wurde, ein CR LF gibt. Ist das auf Ihrem System nicht der Fall? –

+0

In den ursprünglichen Dateien habe ich sie nur die "Datenleitung" LF und ich möchte es einfügen, so dass es "Datenleitung" CR LF sagen. Wie auch immer, ich kann das tun? –

1

Ich würde etwas ähnlich wie Jon Dechiro tun, aber ich würde den gesamten Text in eine Variable als eine mehrzeilige Zeichenfolge sammeln und dann in Stücke teilen, die alles von einem [IMPORT] bis zum nächsten (oder dem Ende) enthalten die Datei), dann Ausgabe jedes Element in einer FOR Schleife:

$Path = "C:\Users\Pepe\Desktop\TestInfoFolder" 
$InputText = (Get-Content "$Path\*.txt" -Raw) -join "`r`n" 
$SplitText = $InputText -split "(?s)(\[IMPORT].*?)(?=\[IMPORT]|$)"|?{$_} 
New-Item -Path $Path\Output -ItemType Directory -Force|Out-Null 
For($i=0;$i -le $SplitText.Count;$i++){ 
    $SplitText[$i] | Set-Content "$Path\Output\Results$($i+1).txt" -Force 
} 

, dass ein Ordner „Output“ in dem Pfad erstellen, und die Ergebnisse dort speichern.

Verwandte Themen